ルートにある通常のWebページとフォルダーにある多くのJoomlaサイトで構成される非常に大きなサイトがあります。
そのため、次のようになります。
- index.php (root)
- about.php (root)
- product.php (root)
/joomlasite1
/joomlasite2
/joomlasite3
Httpsとwwwを強制するために、.htaccess
にリダイレクトを配置するためにWebホストに依頼しました。しかし、これを行うと、すべてのJoomlaサイトがルートにリダイレクトされたため、削除する必要がありました。
これは彼らが入れた規則です:
RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
誰かがこれを行う最善の方法を提案できますか?ルートとすべてのJoomlaサイトフォルダにリダイレクトを配置する必要がありますか?
あなたが説明するものは、標準のHTTPからHTTPS(およびwww以外のwwwへ)リダイレクトのように聞こえるので、ウェブホストのディレクティブがあなたが示唆する方法で失敗した理由は明らかではありません。
ただし、各/joomlasite
にはmod_rewriteディレクティブも含まれる独自の.htaccess
ファイルがあると予想されるため、問題が複雑になる可能性があります。ただし、どちらかといえば、これらのサブディレクトリがまったくリダイレクトされないことが予想されます。 (下記参照。)
HTTPをHTTPSにリダイレクトし、www以外をwwwにリダイレクトするには、サイトのルートにある.htaccess
ファイルの上部付近で次のことを試してください。
RewriteEngine On
RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_Host} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=302,L]
テストする前に、ブラウザのキャッシュをクリアしてください。
これは、サーバーにSSL証明書がインストールされており、SSLフロントエンドプロキシを使用してSSLを管理していないことも前提としています。
これは302の一時的なリダイレクトであることに注意してください。正常に機能していることが確実な場合にのみ、301の永続的なリダイレクトに変更してください。 301はブラウザによってハードキャッシュされるため、テストが問題になる可能性があります。
PDATE:ドメインのハードコーディングを必要としない、より一般的なソリューションが必要な場合は、代わりに次のようなことができます。
RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_Host} !^www\.
RewriteCond %{HTTP_Host} ^(?:www\.)?(.+)\.?$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=302,L]
これは、RewriteCond
ヘッダーからドメインの頂点をキャプチャするために必要な追加のHost
ディレクティブを除いて、上記と非常に似ています。
一般的なソリューションは、必ずしも「最良のソリューション」ではありません。 (そうかもしれませんが。)さまざまなサーバー構成の無限の世界では、ドメイン名のハードコーディングが最も信頼性の高いソリューションになることがよくあります。
ただし、これは、独自の.htaccess
ファイルを含むサブディレクトリに対しては何も実行しない場合があります(これらのファイルにmod_rewriteディレクティブも含まれている場合)。この場合、各サブディレクトリの.htaccess
ファイルで上記のディレクティブを繰り返すか、各サブディレクトリの.htaccess
ファイルに次のディレクティブを配置してmod_rewriteの継承を有効にする必要があります。
RewriteOptions InheritBefore
または、Apache 2.4.8+では、代わりにroot.htaccess
ファイルのみに次のディレクティブを含めることができます。
RewriteOptions InheritDownBefore
ただし、既存のディレクティブを変更せずにmod_rewriteの継承が成功するかどうかは、親の.htaccess
ファイルにある他のディレクティブに依存します。
mod_rewriteの継承は簡単ではありません。ディレクティブは文字通りインプレースでコピーされます。したがって、相対ファイルパスに依存するディレクトリごとのディレクティブがある場合、これらは壊れる可能性があります。 (これが主に、RewriteRule
patternからURLパスをキャプチャするのではなく、上記のディレクティブでREQUEST_URI
を使用した理由です。)システムについての詳細を知っている-単純にリダイレクトディレクティブ(上記)を各サブ.htaccess
ファイルにコピーすることです。
更新:
これは彼らが入れた規則です:
RewriteEngine on RewriteCond %{HTTPS} !=on [NC] RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
これらのディレクティブがサイトのドキュメントルートの.htaccess
ファイルで使用され、mod_rewriteの継承も有効になっている場合(上記を参照)、これは実際に見られる動作を示します。 /joomlasite
のすべてがルートにリダイレクトされます。例えば。 http://www.example.com/joomlasite/foo
はルートのhttps://www.example.com/foo
にリダイレクトされます-/joomlasite
ディレクトリは事実上「失われています」。
これは、継承されたディレクティブがインプレースでコピーされるためです(上記のとおり)。これらのディレクティブが.htaccess
サブディレクトリの/joomlasite
ファイルのコンテキストで実行される場合、RewriteRule
pattern(および後で$1
後方参照で使用される)によってキャプチャされたURLパス)は、joomlasite/foo
ではなくfoo
になります。これは、ディレクトリプレフィックス(.htaccess
ファイルが置かれている場所)が最初にURLパスから削除されるためです。これにより、フォームhttps://www.example.com/foo
のsubstitutionが生成されます。
ただし、REQUEST_URI
の代わりに$1
を使用する、以前に投稿したディレクティブは、REQUEST_URI
に要求の完全なURLパスが常に含まれるため、この問題を回避できます。
@MrWhiteの詳細な説明をありがとう。質問があります。コードを実装しようとしたときに、無限のリダイレクトループが発生しました。私は代替案を検討しましたが、これは以下で機能しました。なぜこの2つが異なるのでしょうか?それを引き起こす何らかのサーバー構成がありますか?
RewriteEngine On
# Redirect HTTP with www to HTTPS with www
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_Host} ^www\. [NC]
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [R=302,L]
# Redirect HTTP without www to HTTPS with www
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_Host} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_Host}%{REQUEST_URI} [R=302,L]
# Redirect HTTPS without www to HTTPS with www
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_Host} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_Host}%{REQUEST_URI} [R=302,L]