私はelasticbeanstalkを使用してHTTPリクエストを安全なポートにリダイレクトしています。
すべてのリクエストをhttps://example.com
にリダイレクトしたいと思います。
次のシナリオが機能しています
http://www.example.com
-> https://example.com
http://example.com
-> https://example.com
しかしながら、
https://www.example.com
->は機能せず、https://www.example.com
にリダイレクトされます次の書き換えルールを使用しています
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_Host} ^www\. [NC]
RewriteCond %{HTTP_Host} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
私はユースケースを理解するために次の記事の助けを借りました https://simonecarletti.com/blog/2016/08/redirect-domain-http-https-www-Apache/
私の理解によると、次の条件が機能するはずです
RewriteCond %{HTTP_Host} ^www\. [NC]
私の理解によると、次の条件が機能するはずです
RewriteCond %{HTTP_Host} ^www\. [NC]
はい、これは「機能します」。ただし、最初の条件:
RewriteCond %{HTTP:X-Forwarded-Proto} =http
ディレクティブがHTTPリクエストに対してのみ処理されるようにします。
Elastic Beanstalkを使用している場合は、とにかく%{HTTPS}
をチェックする必要があるとは思いません(少なくともneed to)-常にoff
になります。この冗長なチェックを削除し、OR
フラグを最初の条件に移動することで、問題を解決できます。例えば:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]
RewriteCond %{HTTP_Host} ^www\. [NC]
RewriteCond %{HTTP_Host} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
(Aside:%{HTTP:X-Forwarded-Proto}
と%{HTTPS}
の両方をチェックするときは注意が必要です。これにより、プロキシの背後から提供されない場合、誰かがリダイレクトをバイパスできる可能性があります。プロキシの背後からコンテンツを提供する場合は、%{HTTP:X-Forwarded-Proto}
をチェックしないでください。)