У нас есть веб-сайт Apache, некоторые части которого работают на JBoss. Вопрос в том, как мы можем заставить Apache перенаправлять все HTTP-запросы на эквивалент HTTPS?
На нашем старом сервере (CentOS 4, Apache 2.0, mod_jk) у нас есть следующая конфигурация:
<VirtualHost 1.2.3.4:80>
Redirect / https://www.foo.com/
</VirtualHost>
Это прекрасно работает - любые запросы к веб-странице на PHP, ванильном HTML или JBoss перенаправляются. Однако на нашем новом сервере (CentOS 5, Apache 2.2, mod_proxy_ajp) та же конфигурация только работает для обычных страниц - не для того, что отправляется в JBoss с использованием AJP.
Я также пробовал следующее, что нашел на http://www.webmasterworld.com/apache/3050511.htm:
<Proxy *>
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
</Proxy>
Но все равно не повезло. Я чувствую, что упускаю что-то очевидное. Любая помощь?
P.S. Я ни в коем случае не эксперт по Apache. Прошу прощения, если это окажется вопрос новичка :-P.
Если я вас правильно понял, вы хотите обновить все HTTP-запросы до https. Если это правильно, попробуйте это
<VirtualHost ip:80>
ServerName www.company.com
RedirectMatch permanent ^(.*)$ https://www.company.com$1
</VirtualHost>
<VirtualHost ip:443>
ServerName www.company.com
Include vhosts.d/includes/ssl.conf
# assumes you want to proxy everything on this vhost to jboss:8009
<Location / >
ProxyPass ajp://jboss:8009/
</Location>
</VirtualHost>
Этот синтаксис будет перенаправлять на HTTPS, сохраняя хост и URL одинаковыми:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Иногда вы хотите перенаправить только каталог, то есть область администрирования:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^/admin(|/.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Более эффективный синтаксис для перенаправления ssl использует apache env var HTTPS
Вам это нравится:
Перезапись хоста
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule .* https://yourhost.com%{REQUEST_URI} [R,L]
Без перезаписи хоста
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Что касается прокси-сервера mod_jk vs apache2.2 ajp, я использую mod_jk только потому, что я считаю JkMount и JkUnMount полезными, когда вам нужно разделить статический и динамический контент, я бы сказал, что это более просто. Я структурирую свои конфигурации с условным включением для ssl. Итак, у меня есть один httpd.conf для каждого хоста, у меня есть каталог для каждого conf, включая следующий способ:
/etc/httpd/test_conf.httdp.conf:
SeverName test.com
ServerRoot /etc/httpd
LoadModule jk_module modules/mod_jk.so
LoadModule ssl_module/mod_ssl.so
(snip)
Include conf/test_com/*.conf
/etc/httpd/test_conf/mod_jk.conf
<IfModule jk_module>
JkWorkersFile conf/test_conf/workers.properties
JkLogFile logs/test_conf/mod_jk.log
JkLogLevel error
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkRequestLogFormat "%w %V %T"
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(PUT|DELETE|TRACK|OPTIONS|TRACE)
RewriteRule .* - [F]
JkMount /* loadbalancer
JkUnMount /error* loadbalancer
JkShmFile run/jk.shm
<Location /jkstatus/>
JkMount status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
</IfModule>
/etc/httpd/conf/test_conf/workers.properties
worker.list=loadbalancer,status
worker.node1.port=8009
worker.node1.host=192.168.1.100
worker.node1.type=ajp13
worker.node1.lbfactor=2
worker.node1.ping_mode=A
worker.node1.connect_timeout=10000
worker.node1.prepost_timeout=10000
worker.node1.socket_timeout=90
worker.node1.connection_pool_timeout=600
worker.node1.method=R
worker.node1.fail_on_status=500,501,502,503
worker.node2.reference=worker.node1
worker.node2.host=192.168.1.200
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=node1,node2
worker.loadbalancer.sticky_session=true
worker.status.type=status
/etc/httpd/conf/test_conf/httpd-ssl.conf
<IfModule ssl_module>
Listen 192.200.10.100:443
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
(snip)
<VirtualHost 192.200.10.100:443>
DocumentRoot "/var/www/test.com/htdocs"
ServerName test.com
(snip)
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA
SSLCertificateFile "conf/test_conf/ssl/test_com.crt"
SSLCertificateKeyFile "conf/test_conf/ssl/test_com.key"
SSLCACertificateFile "conf/test_conf/ssl/VerisignIntermediate.crt"
BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
JkMount /* loadbalancer
JkUnMount /error* loadbalancer
JkStripSession On
</VirtualHost>
</IfModule>
Как бы вы это ни решили, могу ли я предложить поместить директиву SSLRequireSSL в тех местах, где вы хотите использовать только SSL. Таким образом, если позже в процессе возникнет ошибка конфигурации, через соединение без SSL ничего не будет отображаться.