mod_rewrite - HTTP 到 HTTPS 重定向規則僅在首先通過 HTTP 訪問後才有效
我在 Elastic Beanstalk 上部署了一個 Tomcat 8 應用程序,它使用我的主應用程序的子域。兩者都是獨立的應用程序,不互動。我有一條
mod_rewrite
規則將所有http
請求重定向到文件夾https
中的配置文件中.ebextensions
-files: "/etc/httpd/conf.d/httpd_redirect.conf" : mode: "000644" owner: root group: root content: | LoadModule rewrite_module modules/mod_rewrite.so RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://sub.domain.com%{REQUEST_URI} [L,R]
所以理想情況下,訪問應用程序的人
sub.domain.com
將http://sub.domain.com
被重定向到https://sub.domain.com
.問題是這只有在我
https
首先請求應用程序之後才有效。所以,我必須先請求https://sub.domain.com
,從那時起,non-https
請求將被重定向到https
.此外,這僅在我清除瀏覽器記憶體之前有效。清除記憶體後,
non-https
請求不再重定向到https
. 我https
首先再次請求重定向開始工作。這可能是什麼原因造成的?如果重要,主域使用與子域不同的證書。
如何強制應用程序始終使用
https
?我在負載均衡器上啟用了一個安全偵聽器,此配置文件位於
.ebextensions
-option_settings: aws:elb:listener:443: SSLCertificateId: arn:aws:acm:us-east-2:1234567890123:certificate/#################################### ListenerProtocol: HTTPS InstancePort: 80
問題不在於重寫規則。該文件必須放置在其中的特定路徑中
.ebextensions
才能在 Tomcat 8 中工作。配置文件也必須進行不同的設置。提供的大多數範例都不適用於 Tomcat,因此我最終將它們放在錯誤的位置。什麼有效-
在
/.ebextensions/httpd/conf.d/myconf.conf
,放置 -LoadModule rewrite_module modules/mod_rewrite.so
並且在
/.ebextensions/httpd/conf.d/elasticbeanstalk/00_application.conf
,放置 -<VirtualHost *:80> <Proxy *:80> Order Allow,Deny Allow from all </Proxy> ProxyPass / http://localhost:8080/ retry=0 ProxyPassReverse / http://localhost:8080/ ProxyPreserveHost on RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent] ErrorLog /var/log/httpd/elasticbeanstalk-error_log </VirtualHost>
注意使用
.conf
文件而不是.config
. 這個很重要!此外,我得到的重定向錯誤感覺是由於瀏覽器記憶體為我提供了該
https
站點。這就是為什麼當我清除記憶體時它不起作用的原因。