
複数のドメインにまたがるサーバーを備えたアプリケーションが 1 つあります (各ドメインでアプリケーションの外観がカスタマイズされます)。
さらに、上記と同じデータを表示するために複数のサブドメインを持つ共通ドメインがあります。
つまり、www.apples.com
同じように見えますapples.efruit.co.uk
そして - はwww.bananas.co.uk
次のように表示されますbananas.efruit.co.uk
等
現在、efruit.co.uk ドメイン用のワイルドカード SSL があるので、htaccess ファイルを使用して、すべての efruit.co.uk リクエストで https を使用するように強制します (まだ使用していない場合)。
他のすべてのドメインには SSL がないため、ブラウザーの警告を回避するには http を使用する必要があります (これも htaccess ファイルから)。
また、誰かが www.apples.efruit.co.uk と入力すると apples.efruit.co.uk (上記のように https 経由) に書き換えられるように htaccess ファイルを使用したいと思います。ただし、efruit.co.uk ドメインでない場合は www. で問題ありません。
最後に、CodeIgniter の標準的で十分に文書化された書き換えルールを使用して、URL をよりきれいにします。
今のところ私が持っているものは次のとおりです。
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{REQUEST_URI} !(health_check\.php)$
RewriteCond %{HTTP_HOST} ^(.*)\.efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
RewriteCond %{HTTP_HOST} !^(.*)\.efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
RewriteCond %{HTTP_HOST} ^www\.([^\.]*)\.efruit\.co\.uk$
RewriteRule (.*) https://%1.efruit.co.uk$1 [R,L]
# block hidden directories
RewriteRule "(^|/)\." - [F]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]
ただし、唯一機能していると思われるのは、efruit.co.uk ドメインを https 経由で提供するように強制することです。
答え1
SSL プロキシ(?) の背後にいるようです。そのため、サーバー変数X-Forwarded-Proto
ではなく、リクエスト ヘッダーが使用されていますHTTPS
。
RewriteCond %{REQUEST_URI} !(health_check\.php)$ RewriteCond %{HTTP_HOST} ^(.*)\.efruit\.co\.uk RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
この部分は「機能する」(「ドメインを https 経由で提供するように強制する」)と述べていますがefruit.co.uk
、メインのベア ドメインはリダイレクトされず、リクエストに存在する場合は www サブドメインも維持されます。セカンダリ リダイレクトを回避するには、まずこれを削除する必要があります。したがって、これらのディレクティブの順序を変更する必要があります。
また、これをバックリファレンスとして使用する予定がない限り、キャプチャ グループ (括弧で囲まれたサブパターンなど) も必要ありません (バックリファレンスとして使用する予定はないようです)。
他のすべてのドメインには SSL がないため、ブラウザーの警告を回避するには http を使用する必要があります (これも htaccess ファイルから)。
.htaccess
これらの他のドメインでブラウザの警告を回避するために、HTTPSからHTTPへのリダイレクトを発行することはできません。これがあなたが提案していることのようです。無効なSSL証明書のためブラウザの警告発生する前に .htaccess
が実行されます。SSL ハンドシェイクはリクエストの最初に発生します。
RewriteCond %{HTTP_HOST} !^(.*)\.efruit\.co\.uk RewriteCond %{HTTP:X-Forwarded-Proto} =https RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
したがって、ユーザーが SSL 証明書の警告に同意しない限り (同意すべきではありません)、上記は実際にはブラウザーから実行されません。
RewriteCond %{HTTP_HOST} ^www\.([^\.]*)\.efruit\.co\.uk$ RewriteRule (.*) https://%1.efruit.co.uk$1 [R,L]
この場合、バックリファレンスにスラッシュのプレフィックスがない.htaccess
ため、ドキュメントルート以外では無効なリダイレクトになります。ドキュメントルートの場合でも、末尾にスラッシュを含める必要があります。$1
代替(ただし、ブラウザはこれを暗黙的に修正します)。また、REQUEST_URI
最初の 2 つのルールではサーバー変数を使用したのに、ここではバック参照を使用したのはなぜでしょうか?
代わりに次のようなことを試してください。
# Prevent any fruther processing when requesting "health_check.php"
# CHECK: Absence of start of string anchor?
RewriteRule health_check\.php$ - [L]
# Remove www sub-subdomain (and redirect to HTTPS)
RewriteCond %{HTTP_HOST} ^www\.([^.]+)\.efruit\.co\.uk [NC]
RewriteRule .* https://%1.efruit.co.uk%{REQUEST_URI} [R,L]
# HTTP to HTTPS redirect for the "efruit.co.uk" domain (and subdomains)
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteCond %{HTTP_HOST} ^([^.]+\.)?efruit\.co\.uk [NC]
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
# HTTPS to HTTP redirect for none "efruit.co.uk" domains
# Note that the user will still have to click through any browser security warnings
RewriteCond %{HTTP_HOST} !(^|\.)efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
その他の注意事項:
- 文字クラス内で使用する場合、リテラルドットをバックスラッシュでエスケープする必要はありません。
$
末尾にドットが含まれる FQDN を検出するために、ホスト チェックで文字列の末尾のアンカーを削除しました。- これらの永続的な (301) リダイレクトが正常に動作していることを確認したら、おそらく変更したくなるでしょう。つまり、
R
に変更しますR=301
。