
サーバー上の 301 リダイレクト チェーンの量を減らそうとしているので、インスタンスがロード バランサーの背後にあるため、サブドメインから非 www リダイレクト (サブドメインが の場合を除くdev
) と HTTP から HTTPS リダイレクト ( を使用%{HTTP:X-Forwarded-Proto}
) を組み合わせたいと思います。
これまでに私が持っているものは次のとおりです.htaccess
。
# move http to https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=301]
# Remove leading www
RewriteCond %{HTTP_HOST} ^www.example.net [NC]
RewriteRule ^(.*)$ https://example.net/$1 [R=301,L]
現在の実装には 3 つの問題があります。
へのリクエストには
http://www.example.net
2 つのリダイレクトがあります。このサイトのほとんどの www から非 www へのリダイレクトの例と同様に、リダイレクトされないため、私のアナリティクスにはリダイレクトされてい
ww.
ないwwww.
誤って入力されたサブドメインが多数表示されます。開発およびリリースステージングに使用するため、サブドメインとその兄弟を
dev.
リダイレクトから除外したいと思います。http://dev.example.net
https
dev.
これをどのように組み合わせればよいでしょうか?
答え1
1) へのリクエストには
http://www.example.net
2 つのリダイレクトがあります。
これは、2 つのルールを逆にするだけで解決できます。www.example.net
最初のリダイレクトで HTTPS にリダイレクトされるため、HTTP から HTTPS へのリダイレクトをトリガーする必要はありません。
(ただし、これは実装するつもりがないことを前提としていますHSTS- その場合、同じホスト名でHTTPSにリダイレクトするため、2つのリダイレクトとして保持する必要があります。初め必須です。
2) このサイトの www から non-www へのリダイレクトのほとんどの例と同様に、リダイレクトされないため
ww.
、wwww.
私のアナリティクスにはリダイレクトされていない入力ミスのサブドメインが多数表示されます。
通常、ww.
またはwwww.
サブドメインへのリクエストは単純に解決されないため、通常は問題にはなりません。これを機能させるには、ワイルドカードDNS でサブドメインを設定し、そのような要求を受け入れるようにサーバーを構成しました。
^www\.
しかし、これは正規表現 (スニペット) をからに変更することで解決できます^w{2,4}\.
。
3)開発およびリリースステージングに使用するため、サブドメインとその兄弟を
dev.
リダイレクトから除外したいと思います。http://dev.example.net
https
dev.
これは HTTP から HTTPS へのルールにのみ適用されるため、ここで追加の条件を適用して、 で始まるホスト名を除外することができますdev.
。
上記の点をまとめると、次のことを試してください。
# Remove leading ww, www or wwww (and redirect to HTTPS)
RewriteCond %{HTTP_HOST} ^w{2,4}\.example\.net [NC]
RewriteRule (.*) https://example.net/$1 [R=301,L]
# Move http to https (except dev subdomain)
RewriteCond %{HTTP:Host} !^dev\. [NC]
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP:Host}%{REQUEST_URI} [R=301,L]
これがロード バランサーの要件である場合に備えて、同じ使用方法を維持しましたHTTP:Host
(HTTP 要求ヘッダーにアクセスするためHost
)。それ以外の場合は、ここでサーバー変数を使用する方が一般的ですHTTP_HOST
。
!
の接頭辞条件パターン(つまり!^dev\.
)は正規表現を否定するので、条件が成立するのHost
はないから始めますdev.
。( というwww.dev.
ものはないのでしょうか?)
(.*)
^(.*)$
正規表現はデフォルトで貪欲なので、と同じです。
テストする前にブラウザのキャッシュをクリアする必要があります。キャッシュの問題を回避するために、最初に 302 (一時) リダイレクトでテストすることをお勧めします。
答え2
# Remove leading www, always using https regardless of the current URL scheme
RewriteCond %{HTTP_HOST} ^w{2,4}.example.net(?::|$) [NC,NV]
RewriteRule .* https://example.net%{REQUEST_URI} [L,R=301]
# move http to https, except for dev.example.net
RewriteCond %{HTTP:X-Forwarded-Proto} =http [NC,NV]
RewriteCond %{HTTP_HOST} !^dev.example.net(?::|$) [NC,NV]
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
- 条件に
NC
( ) フラグを追加しました。この値は大文字と小文字が区別されない (つまり ) ようです。このフラグは削除してもかまいません。nocase
X-Forwarded-Proto
HTTP = Http = hTTp = http
- 応答ヘッダーから非表示にするために、条件に
NV
(novary
) フラグを追加しました。繰り返しますが、特にそうでない場合 (リバース プロキシはクライアントに送信する前に自動的にフィルター処理します)、または正しいキャッシュ動作に必要な場合 (キャッシュはそれ以外の場合はコンテンツを区別しません) は、これを削除してもかまいません。X-Forwarded-Proto
Vary
http
https
- レスポンス ヘッダーから非表示にするために、ヘッダー条件に
NV
(novary
) フラグを追加しました。キャッシュ サーバーが壊れている場合は、これを削除することもできます。Host
Vary
- フラグの順序を一貫させました
RewriteRule
(L,R=301
そしてR=301,L
本質的に同じです)。 - 認識されないようにする
www.example.net.but.not.actually.yours.com
が、例えば、は許可するwww.example.net:443
。 %{REQUEST_URI}
代替品として一貫して使用します。- また、認識し
ww
、wwww
。