Apacheは、1つを除くすべてのサブドメインをwww以外のhttpsに書き換えます。
サーバー上の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)へのリクエストに
http://www.example.net
は2つのリダイレクトがあります。
これは、2つのルールを逆にするだけで解決できます。次にwww.example.net
、最初のリダイレクトでHTTPSにリダイレクトされるため、HTTPからHTTPSへのリダイレクトをトリガーする必要はありません。
(ただし、これはHSTSを実装する意図がないことを前提としています。この場合、最初に同じホスト名でHTTPSにリダイレクトする必要があるため、2つのリダイレクトとして保持する必要があります。)
2)このサイトのほとんどのwwwから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
、(Host
HTTPリクエストヘッダーにアクセスするために)同じものを使用し続けましたか?それ以外の場合は、HTTP_HOST
ここでサーバー変数を使用するのが一般的です。
CondPatternの!
プレフィックス(つまり、)は正規表現を否定するため、がで始まらない場合、条件は成功します。(私は物ではないと思いますか?)!^dev\.
Host
dev.
www.dev.
(.*)
^(.*)$
正規表現はデフォルトで貪欲なのでと同じです。
テストする前に、ブラウザのキャッシュをクリアする必要があります。キャッシュの問題を回避するために、最初に302(一時)リダイレクトでテストすることをお勧めします。
# 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
。