Apache は 1 つを除くすべてのサブドメインを www なしの https に書き換えます。

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 つの問題があります。

  1. へのリクエストにはhttp://www.example.net2 つのリダイレクトがあります。

  2. このサイトのほとんどの www から非 www へのリダイレクトの例と同様に、リダイレクトされないため、私のアナリティクスにはリダイレクトされていww.ないwwww.誤って入力されたサブドメインが多数表示されます。

  3. 開発およびリリースステージングに使用するため、サブドメインとその兄弟をdev.リダイレクトから除外したいと思います。http://dev.example.nethttpsdev.

これをどのように組み合わせればよいでしょうか?

答え1

1) へのリクエストにはhttp://www.example.net2 つのリダイレクトがあります。

これは、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.nethttpsdev.

これは 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]
  1. 条件にNC( ) フラグを追加しました。この値は大文字と小文字が区別されない (つまり ) ようです。このフラグは削除してもかまいません。nocaseX-Forwarded-ProtoHTTP = Http = hTTp = http
  2. 応答ヘッダーから非表示にするために、条件にNV( novary) フラグを追加しました。繰り返しますが、特にそうでない場合 (リバース プロキシはクライアントに送信する前に自動的にフィルター処理します)、または正しいキャッシュ動作に必要な場合 (キャッシュはそれ以外の場合はコンテンツを区別しません) は、これを削除してもかまいません。X-Forwarded-ProtoVaryhttphttps
  3. レスポンス ヘッダーから非表示にするために、ヘッダー条件にNV( novary) フラグを追加しました。キャッシュ サーバーが壊れている場合は、これを削除することもできます。HostVary
  4. フラグの順序を一貫させましたRewriteRuleL,R=301そしてR=301,L本質的に同じです)。
  5. 認識されないようにするwww.example.net.but.not.actually.yours.comが、例えば、は許可するwww.example.net:443
  6. %{REQUEST_URI}代替品として一貫して使用します。
  7. また、認識しwwwwww

関連情報