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

Jan 30 2020

サーバー上の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.netは2つのリダイレクトがあります。

  2. このサイトのほとんどのwwwからwww以外へのリダイレクトの例のように、リダイレクトされww.ないwwww.ため、私の分析には、リダイレクトされていないタイプミスのサブドメインがたくさんあります。

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

これをどのように組み合わせるのですか?

回答

1 MrWhite Jan 31 2020 at 05:43

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、(HostHTTPリクエストヘッダーにアクセスするために)同じものを使用し続けましたか?それ以外の場合は、HTTP_HOSTここでサーバー変数を使用するのが一般的です。

CondPattern!プレフィックス(つまり、)は正規表現を否定するため、がで始まらない場合、条件は成功します。(私は物ではないと思いますか?)!^dev\.Hostdev.www.dev.

(.*)^(.*)$正規表現はデフォルトで貪欲なのでと同じです。

テストする前に、ブラウザのキャッシュをクリアする必要があります。キャッシュの問題を回避するために、最初に302(一時)リダイレクトでテストすることをお勧めします。

2 Jin-ohKang Jan 31 2020 at 05:52
# 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. 条件にNCnocase)フラグを追加しました。これX-Forwarded-Protoは、その値が大文字と小文字を区別しないように見えたためHTTP = Http = hTTp = httpです。これは自由に削除できます。
  2. 条件にNVnovary)フラグを追加X-Forwarded-Protoして、Vary応答ヘッダーから非表示にしました。繰り返しになりますが、特にそうでない場合(リバースプロキシはクライアントに送信する前に自動的にフィルタリングします)、または正しいキャッシュ動作が必要な場合(キャッシュは他の方法httpではhttpsコンテンツを区別しません)、これを自由に削除できます。
  3. ヘッダー条件にNVnovary)フラグを追加Hostして、Vary応答ヘッダーから非表示にしました。キャッシュサーバーが壊れている場合は、これを削除することもできます。
  4. 製のRewriteRule一貫した(フラグ順序L,R=301R=301,L本質的に同じであるが)。
  5. 防止www.example.net.but.not.actually.yours.com認識されてから、まだたとえばことができますwww.example.net:443
  6. %{REQUEST_URI}代替として一貫して使用します。
  7. また、認識wwしてくださいwwww