web-dev-qa-db-ja.com

httpsを強制すると、すべてのフォルダーがリダイレクトされます

ルートにある通常の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サイトフォルダにリダイレクトを配置する必要がありますか?

1
caffeinehigh

あなたが説明するものは、標準の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の継承は簡単ではありません。ディレクティブは文字通りインプレースでコピーされます。したがって、相対ファイルパスに依存するディレクトリごとのディレクティブがある場合、これらは壊れる可能性があります。 (これが主に、RewriteRulepatternから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ファイルのコンテキストで実行される場合、RewriteRulepattern(および後で$1後方参照で使用される)によってキャプチャされたURLパス)は、joomlasite/fooではなくfooになります。これは、ディレクトリプレフィックス(.htaccessファイルが置かれている場所)が最初にURLパスから削除されるためです。これにより、フォームhttps://www.example.com/foosubstitutionが生成されます。

ただし、REQUEST_URIの代わりに$1を使用する、以前に投稿したディレクティブは、REQUEST_URIに要求の完全なURLパスが常に含まれるため、この問題を回避できます。

2
MrWhite

@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]
0
caffeinehigh