複数の条件付きリダイレクトをすべて 1 つの .htaccess にまとめる (ランディング ページ)

複数の条件付きリダイレクトをすべて 1 つの .htaccess にまとめる (ランディング ページ)

「近日公開」という 1 ページの HTML だけを含むフォルダーがあります。

次に、必要に応じてこのフォルダーを指すドメインをいくつか用意します。

簡単ですよね?

私が望むのは、元のリクエストされたページが非wwwの場合はwww(301)に移動し、httpsでない場合はhttps(301)に移動し、すべてのトラフィックをhttps://www.originating-domain.xzy/index.html(302)にリダイレクトする条件です。

目的は、これを多目的に使用できるランディングページとすることですが、常に301からhttps://www 302にリダイレクトされます。index.html

各サイトで、非 www から www へ、および http から https への変換がすでに機能しています。

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]

ここで、 302 一時リダイレクトを追加したいと思いますindex.html

それとも、これを完全に行うより良い方法があるのでしょうか?いずれにせよ、これはすべて一時的なものなので... 302 すべてのトラフィックをインデックスに送信します。これを試しましたが、機能しませんでした

RewriteCond %{REQUEST_URI} !.*index\.html
RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]

答え1

RewriteCond %{REQUEST_URI} !.*index\.html
RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]

これにはいくつか問題があります...

  1. 不足しているようですRewriteRule パターン(最初の引数) が完全に一致しないため、このディレクティブは一致しません。

  2. www.一致した場合はサブドメインのプレフィックスとなるまた. このリダイレクトを設定していると思います正規のリダイレクト (HTTP から HTTPS へ、非 www から www へ) - 当然のことですが。したがって、これは にリダイレクトされます。https://www.www.example.com/index.htmlこのリダイレクトがトリガーされる時点では、ホスト名はすでに正規化されているからです。

状態(RewriteCondディレクティブ) は実際には必要ありません。このチェック (/index.htmlまだ要求されていないもの) は、ディレクティブ自体によってより効率的に処理できるためですRewriteRule

例えば:

RewriteRule !^index\.html$ /index.html [R=302,L]

スキーム+ホスト名を含める必要はありません。代替いずれにせよ同じ場所にリダイレクトしたいので、 . 文字列を使用します。明示的に記述したい場合は、 . と記述できますhttps://%{HTTP_HOST}/index.html

現状では、index.html他のものを参照することはできません。地元これらのリクエストもリダイレクトされるため、ローカル リソース (画像、CSS、JavaScript など) へのアクセスを許可しないでください。ローカル リソースへのアクセスを許可するには、静的リソースのリクエストを除外するための条件をいくつか追加する必要があります。

RewriteCond %{REQUEST_URI} !.\.(jpg|png|webp|css|js)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.html$ /index.html [R=302,L]

あるいは、これらのリソースを外部ドメインでホストします。(またはサブディレクトリでホストし、サブディレクトリ全体を除外します。)

ただし、どうしても「リダイレクト」を選択する場合は、たとえば、よりユニークで意味のある名前のファイルにリダイレクトするでしょう。/coming-soon.htmlを使用する場合の問題/index.htmlは、後でその URL で別のコンテンツを提供したい場合、それが (何らかの理由で) キャッシュされていることです。ただし、/coming-soon.htmlおそらく「noindex」にする必要があります。

しかし、リダイレクトを一切行わず、代わりに一時的「503 サービスは利用できません」という応答。私の答え詳細については、Web マスター スタックの次の質問を参照してください。


余談:

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]

SSL 接続を管理するフロントエンド プロキシの背後にいますか?

もしそうなら、それは問題ありませんが、サーバー変数をチェックする2番目の条件HTTPSは不要です。しかし、もしあなたがないX-Forwarded-Proto: httpsSSL プロキシの背後では、リクエストにヘッダーが挿入されると、これらのディレクティブが回避される危険性があります (つまり、ユーザーは HTTPS にリダイレクトされません) 。


アップデート:

これは望みどおりに動作します。しかし、何らかの方法でこれらを組み合わせることはできますか?

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{REQUEST_URI} !.*coming-soon\.html [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/coming-soon.html [R=302,L]

上で述べたように、最後のルールは基本的に次のルールと同じであり (前述の正規リダイレクトと組み合わせて使用​​した場合)、よりシンプルで効率的です。

RewriteRule !^coming-soon\.html$ /coming-soon.html [R=302,L]

2番目のルールでは、RewriteRule パターンから^(.*)$^(最初のルールと同じ)。^(.*)$不必要に後方参照をキャプチャし、効率が低下します。

以前のコメント(現在は削除済み)で、これを任意のサブドメインでも機能させたいとおっしゃっていました。これは任意のサブドメインで「機能」しますが、常に追加のwwwサブドメインが先頭に追加されます。これは望ましいことかもしれませんし、そうでないかもしれません。(wwwサブドメインにサブサブドメインが存在することは通常ありません。サブドメイン(人によって違います。)

これらのルールを「組み合わせる」必要はまったくありません。「近日公開」ページに 302 リダイレクトする前に、www+HTTPS に 301 リダイレクトしたい場合は、ルールを組み合わせることはできません。最初の 2 つのルール (301 リダイレクト) を 1 つのルールに「組み合わせる」ことはできますが、何の役にも立ちません。

ここでの唯一の小さな問題は、潜在的に (最大で) 2 つのリダイレクトがあることです。最初は、元の URL パスの www+HTTPS への 301 で、2 番目は「近日公開」ページへの 302 です。

いずれにせよユーザーをリダイレクトする場合、最初の301リダイレクトをwww+HTTPSにする必要があるかどうか疑問に思います。一時的「近日公開」ページ。新しいサイトを実装したら (「近日公開」ページを置き換えて)、正規のリダイレクトを実装します。302 リダイレクトは、www+HTTPS にリダイレクトできます。 (ただし、/coming-soon.html直接要求されるエッジ ケースがあります。)

例えば:

# 302 redirect to the coming soon page (www+HTTPS)
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$
RewriteRule !^coming-soon\.html$ https://www.%1/coming-soon.html [R=302,L]

# Edge case...
# The following two rules only apply if "/coming-soon.html" is requested directly
# and either non-www hostname and/or HTTP is requested
# in which case 301 redirect to the same on www+HTTPS

# www subdomain is missing...
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# HTTP + www has been requested
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

へのリクエストはすべてhttp://example.com/foo302 で に直接リダイレクトされますhttps://www.example.com/coming-soon.html

要求された場合はhttp://example.com/coming-soon.html、301 リダイレクトされますhttps://www.example.com/coming-soon.html(HTTPS と www サブドメインを修正するだけです)。

外部リダイレクトは最大 1 つだけです。

答え2

これは望みどおりに動作します。しかし、何らかの方法でこれらを組み合わせることはできますか?

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{REQUEST_URI} !.*coming-soon\.html [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/coming-soon.html [R=302,L]

関連情報