Mod-Rewrite

mod_rewrite - HTTP 到 HTTPS 重定向規則僅在首先通過 HTTP 訪問後才有效

  • February 9, 2018

我在 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.comhttp://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站點。這就是為什麼當我清除記憶體時它不起作用的原因。

引用自:https://serverfault.com/questions/896449