如何强制Apache将AJAX与HTTPS结合使用?

我们有一个Apache网站,其中某些部分由JBoss提供支持。 问题是,我们如何让Apache强制所有HTTP请求被redirect到HTTPS等价物?

在我们的旧服务器(CentOS 4,Apache 2.0,mod_jk)上,我们有以下configuration:

<VirtualHost 1.2.3.4:80> Redirect / https://www.foo.com/ </VirtualHost> 

这很好 – 任何对PHP,香草HTML或JBoss驱动的网页的请求都会被redirect。 但是,在我们的新服务器(CentOS 5,Apache 2.2,mod_proxy_ajp)上,相同的configuration适用于vanilla页面 – 不适用于使用AJP发送到JBoss的任何内容。

我也尝试了以下,我发现在http://www.webmasterworld.com/apache/3050511.htm :

 <Proxy *> RewriteEngine on RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R] </Proxy> 

但是还是没有运气。 我觉得我失去了一些明显的东西。 任何帮助?

PS我不是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> </Location> 

该语法将redirect到HTTPS,使主机和URL保持不变:

 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

有时你只想redirect一个目录,即一个pipe理区域:

 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^/admin(|/.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

更有效的sslredirect语法是使用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只是因为当你需要分离静态和dynamic内容时,我发现JkMount和JkUnMount是有用的,我会说更简单。 我构造我的configuration的方式是有条件的包括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> 

不过,你解决这个问题,我可以build议把SSLRequireSSL指令放在你想成为SSL的位置。 这样,如果在过程中稍后出现configuration错误,则通过非SSL连接不会显示任何configuration错误。