.htaccess による URL の書き換えと https の強制

.htaccess による URL の書き換えと https の強制

サイト: example.com

Joomla サブディレクトリ: example.com/joomla

example.com/joomla の Joomla インストールをサイトのルートにしたい(またはそう見えるようにしたい)つまり、example.com にアクセスしたユーザーは example.com/joompla/index.php にリダイレクトされますが、URL バーには引き続き example.com が表示されます。また、この機会を利用して、すべての着信接続にHTTPSを使用するように強制したい。オンラインで見つけたスクリプトを使用して、どちらか一方を実行することはできましたが、両方を一貫して実行することはできませんでした。

.htaccess については、これまでに次の内容を実施しました。

RewriteEngine on
RewriteBase /

# Rewrites all URLS without joomla in them
RewriteCond %{REQUEST_URI} !^/joomla/

# Rewrites all URLS with example in them
RewriteCond %{HTTP_HOST} ^(www\.)?example\.

# Rewrite all those to insert /joomla
RewriteRule ^(.*)$ /joomla/$1 [L]

# This works SOME of the time to redirect to https
Header always set Content-Security-Policy "upgrade-insecure-requests;"

# If a request tries to access /joomla directly, redirect it to its secured canonical version
RewriteCond %{THE_REQUEST} joomla/
RewriteRule ^joomla/(.*) http://example.com/$1 [R=301,L]

これは Chrome では時々機能するようです。Joomla インストールにリダイレクトして https に切り替えますが、そこに到達するには強制的にハード リロードを何度も実行しなければならないことがあります。Firefox では決して機能せず、サイトが読み込まれる稀な場合でも http のままです。

私は .htaccess について非常に初心者で、上記の問題に対する最もエレガントで包括的なソリューションを開発したかどうかはわかりません。さまざまなコマンドを使用したりRewriteCond %{HTTPS} !=on、さまざまなコマンドRewriteCond %{SERVER_PORT} 80と組み合わせたりした他の例をオンラインで見たことがありRewriteRuleますが、これらのコマンドを既存の URL 書き換え条件と組み合わせる方法がわかりません。その結果、周辺シナリオを見逃していると思います。

経験のある方、この件について教えていただけませんか? 大変助かります。ここ数日、オンラインで見つけたスクリプトのバリエーションを試していますが、魔法の言葉がまだ見つかっていません。

答え1

既存の指令に関する注意事項:

リライトベース /

を定義しましたがRewriteBase、どのディレクティブでも使用されていません。 はRewriteBase相対パスにのみ適用されます。代替品(関連するディレクティブでルート相対 URL パスを明示的に使用しました)。

# Rewrites all URLS with example in them
RewriteCond %{HTTP_HOST} ^(www\.)?example\.

あなたは必要要求されたホスト名をチェックするには?このルールを適用したくない複数のドメイン(またはサブドメイン)をホストしていない限り、これは状態余計なものです。

# This works SOME of the time to redirect to https
Header always set Content-Security-Policy "upgrade-insecure-requests;"

これ一度もない「リダイレクト」がトリガーされるので、ネットワーク トラフィックで何が見られるのかわかりません。

(実際、投稿したコードには、HTTP から HTTPS への「リダイレクト」をトリガーするものは何もありません。)

このHTTPレスポンスヘッダーにより、ブラウザは自動的に「アップグレード」して、リンクされたリソース(CSS、JS、画像、外部リソースなど) を、本来は HTTP 経由 (実際の URL に が含まれているためhttp://...) である最初の HTML (ページ) 応答から HTTPS 経由に変更します。実際の「リダイレクト」は発生しません。また、プレーン HTTP 経由であった可能性のある最初の HTML 応答には何も起こりません。

サイト全体で HTTP から HTTPS へのリダイレクトを実装していて、リンクされたリソースがすべてすでに HTTPS になっているか、ルート相対 (またはプロトコル相対) URL を使用している場合、このヘッダーは厳密には必要ありません。ただし、このヘッダーは優れたセーフティ ネットを提供します。ただし、HTTPS をサポートしていないリンクされたリソースは、単に機能しなくなり、ユーザーにブラウザーの警告は表示されません。このヘッダーがないと、ユーザーはブラウザーの「混合コンテンツ」警告を受け取る可能性があります (リンクされたリソースは機能しません)。

# If a request tries to access /joomla directly, redirect it to its secured canonical version
RewriteCond %{THE_REQUEST} joomla/
RewriteRule ^joomla/(.*) http://example.com/$1 [R=301,L]

ディレクティブRewriteCond(「通常の状況」でのリダイレクト ループを防ぐために使用) は、joomla/要求された URL のどこにでも一致します。クエリ文字列内でも一致しますが、これは誤りであり、joomla/URL パスまたはクエリ文字列の別の場所に出現すると、誤ったリダイレクトが発生する可能性があります。たとえば、これを任意?joomla/の URL の末尾に追加すると、リダイレクト ループが発生します。

この「リダイレクト」は前に内部書き換え。一般に、「リダイレクト」は「書き換え」の前に記述する必要があります。こうすることで、書き換えられた URL がリダイレクトされ、書き換えられた URL がユーザーに公開されることが回避されます。

コメントに記載されているように、このリダイレクトは HTTP へのものであり、実行しようとしていることとは逆です (HTTP から HTTPS へのリダイレクトを実装すると、小さなリダイレクト チェーンが発生します)。

いくつかの仮定:

  • SSL 証明書はアプリケーション サーバーに直接インストールされます。つまり、SSL を管理する Cloudflare (Flexible-SSL) やその他のフロントエンド プロキシはインストールされません。
  • 他のサブドメインは使用していません。 だけですwww
  • 正規のホスト名は www なしですexample.com(質問のリダイレクトから)。
  • 現時点では HSTS を実装していないため、example.com1 回のリダイレクトで HTTPS と正規のホスト名 (つまり ) にリダイレクトできます。
  • /joomlaJoomla 自体は、URL からサブディレクトリを省略するようにすでに設定されています。/joomla静的リソース (CSS、JS、画像など) へのリンクを含むすべての内部リンクには存在しません。
  • ドキュメント ルートからファイルを提供していません。すべてサブディレクトリに移動します/joomla

シナリオ #1 -.htaccessドキュメント ルート内の 1 つのファイル。

(コメントに記載がある通り)

このシナリオでは、 URL を Joomla フロント コントローラ (つまり ) にルーティングするための.htaccessインストール サブディレクトリ ( )に「Joomla」ファイルがありません。その場合、URL に が存在する必要があり、Joomla の「SEF」URL は使用できません。/joomlaindex.phpindex.php

ルート/.htaccessファイルは次のようになります。

RewriteEngine on

RewriteBase /joomla

# If a request tries to access /joomla directly, redirect it to its secured canonical 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,7}\s/joomla
RewriteRule ^joomla(?:$|/(.*)) https://example.com/$1 [R=302,L]

# Canonicalise the hostname - ie. www to non-www and HTTPS
RewriteCond %{HTTP_HOST} ^www\.(.+?)\.?$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=302,L]

# Redirect remaining requests from HTTP to HTTPS
# The hostname must already be canonical at this point
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]

# Rewrite everything to the /joomla subdirectory
# Uses the value defined in the RewriteBase directive above
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) $1 [L]

# Ensure that any linked resources are requested over HTTPS
Header always set Content-Security-Policy "upgrade-insecure-requests;"

ここではテスト目的で 302 (一時的) リダイレクトを使用していることに注意してください。必ず最初に 302 リダイレクトでテストし、正常に動作することが確認されたら 301 (永続的) に変更してください。301 はブラウザーによって永続的にキャッシュされるため、テストが問題になることがあります。

環境変数 は、最初のルールで使用されるのREDIRECT_STATUSとほぼ同じように、直接要求のみが書き換えられ、書き換えられた要求は書き換えられないようにするために使用されます。は、最初の要求では空で、最初の書き換えが成功した後は「200」(200 OK HTTP 応答ステータス)に設定されます。 このディレクティブは、最初は少し奇妙に見えるかもしれません(それ自体に書き換えられているように見えます)が、結果の置換の前に が付けられているため、実際には に書き換えられます。THE_REQUESTREDIRECT_STATUSRewriteRule (.*) $1 [L]RewriteBase/joomla/<url>

シナリオ #2 - 2 つの.htaccessファイル: ドキュメント ルートとサブディレクトリ

.htaccessサブディレクトリ内のファイルは、Joomlaに付属する/joomla標準的な.htaccessファイルです。これにより、すべてのリクエストが Joomla フロント コントローラ (つまり ) にルーティングされ、Joomla の "SEF" URL の使用が可能になります (つまり、 URL にindex.php明示的に含める必要はありません)。index.php

ルート/.htaccessファイルは次のようになります。

RewriteEngine on

RewriteBase /joomla

# Canonicalise the hostname - ie. www to non-www and HTTPS
RewriteCond %{HTTP_HOST} ^www\.(.+?)\.?$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=302,L]

# Redirect remaining requests from HTTP to HTTPS
# The hostname must already be canonical at this point
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]

# Rewrite everything to the /joomla subdirectory
# Uses the value defined in the RewriteBase directive above
RewriteRule (.*) $1 [L]

# Ensure that any linked resources are requested over HTTPS
Header always set Content-Security-Policy "upgrade-insecure-requests;"

/joomlaURL からサブディレクトリを削除するリダイレクトは削除されており、/joomla/.htaccessファイルに追加する必要があることに注意してください (ここに残しておくと完全に不要になります)。

REDIRECT_STATUS今回はenv varに対するチェックは必要ありません/joomla/.htaccessキャッチ書き換えられた後のリクエスト。(mod_rewrite 継承が有効になっていないと仮定します。)

必要に応じて、ディレクティブを に移動できます。いずれにせよ「継承」されるため、これはオプションですHeader/joomla/.htaccess

その場合、/joomla/.htaccessファイルには次のような内容が含まれます。

# JOOMLA: Set Options here

RewriteEngine on

# If a request tries to access here directly then redirect back to root
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) https://example.com/$1 [R=302,L]

# JOOMLA: Rewrite rules to block out some common exploits.
# :

# Leave the RewriteBase directive commented out - it's not required
#RewriteBase /joomla

## Begin - Joomla! core SEF Section.
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]
## End - Joomla! core SEF Section.

この/joomla/.htaccessファイルは、Joomlaウェブサイトのコードただし、共通要素/コメントを省略し、サブディレクトリに関連するように「SEF セクション」を変更しました。(Joomla では、.*単に の代わりに、効率の低い正規表現も使用されます^。)

関連情報