web-dev-qa-db-ja.com

ApacheでHTTPSとWWWを強制する

Apacheは、フォルダーのサブフォルダーでHTTPSを強制しませんが、第1レベルのサブフォルダーで機能します。

私が試したすべてのHTAccessスニペットを以下に示します。

RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [R=302,L]
RewriteCond %{HTTP_Host} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_Host}/$1 [R=302,L]

RewriteCond %{SERVER_PORT} !=443 [OR]
RewriteCond %{HTTP_Host} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_Host/$1 [R=302,L]

RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [L,R=302]
RewriteCond %{HTTP_Host} !^www\.
RewriteRule .* https://www.%{HTTP_Host}%{REQUEST_URI} [L,R=302]

誰かが答えを持っていることを願って

編集:さらにそれをいじった後、私は問題の一部を見つけました。

たとえば、HTAccessファイルのサイトルートの直下にあるサブフォルダーの1つのサブディレクトリに、このコードがありました

RewriteRule ^jquery_autocomplete.html$ jquery_autocomplete.php [L]

その行を追加するとすぐに、何らかの理由でそのサブディレクトリでHTTPSの強制が停止しますが、再度削除するとすぐにHTTPSが強制されます。

3
itteam

.htaccessを使用しないことを検討してください。これにより、パフォーマンスが向上し、他の.htaccessファイルがconfを上書きすることを回避できます。メインのApache .confファイルに次を追加できます。

<Directory "YOUR WEB DIRECTORY">
   AllowOverride None
   .....
   RewriteCond %{HTTPS} off
   RewriteCond %{HTTP:X-Forwarded-Proto} !https
   RewriteRule ^ https://www.example.com%{REQUEST_URI} [L,R=301]
   ....
</Directory>

これが永続的な変更である場合、302の代わりに301を使用する方が適切であり、302は一時的です

1
plinto

サイトルートの直下にあるサブフォルダーの1つにあるサブディレクトリの1つ、HTAccessファイルに、このコードがありました

そしてそれが問題です。デフォルトでは、mod_rewriteは親フォルダーからディレクティブを継承しません。したがって、サブフォルダー内のmod_rewriteディレクティブは、親フォルダー内のディレクティブ(URLを正規化するディレクティブ)を完全にオーバーライドします。実際、サブフォルダーでRewriteEngineを有効にするだけで、親ディレクティブをブロックできます。

サブディレクトリの.htaccessファイルで、次の追加を試すことができます。

RewriteOptions Inherit

ただし、親.htaccessファイル内のmod_rewriteディレクティブは、サブフォルダー内のディレクティブの後にafter適用されることに注意する必要があります。 (また、継承されたディレクティブは、サブフォルダーの.htaccessファイルに「仮想的にコピー」されます。したがって、期待どおりに動作しない可能性があります。)

Apache 2.4+を使用している場合、追加のオプションがあります。たとえば、ドキュメントルートの.htaccessファイルで次を指定して、allサブフォルダー.htaccessファイルand親ディレクティブが最初に実行されます。

RewriteOptions InheritDownBefore

参照:
http://httpd.Apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions


1つのルールでHTTPSとwwwを強制するには、次のようなことができます:

RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_Host} !^www\.
RewriteRule (.*) https://www.example.com/$1 [R=302,L]

既に持っていたものに似ていますが、%{HTTP_Hostサブドメインが含まれている場合と含まれていない場合があるため、置換にwww.を使用できません(偶然、閉じ中括弧がありません)。 (%{SERVER_NAME}を使用できるかもしれませんが、それはサーバーに依存します。)

302(一時的な)リダイレクトはテストに適していますが、これが正常に機能していることに満足したら301に変更します。

2つの個別のルールを作成するには、3番目のコードブロックを使用します。

2
MrWhite