web-dev-qa-db-ja.com

https://www.example.comからhttps://example.comへのリダイレクトが機能しない

私は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]
2
karan

私の理解によると、次の条件が機能するはずです

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}をチェックしないでください。)

1
MrWhite