からまでのすべての URL をリダイレクトするには、次の.htaccess
ルールを記述します。www.a.com
www.b.com
RewriteEngine on
RewriteCond %{http_host} ^www.a.com [NC,OR]
RewriteCond %{http_host} ^a.com [NC]
RewriteRule ^(.*)$ https://www.b.com/myfolder/ [R=301,NC,L]
現在、 のサブディレクトリの下に、以下のようにファイルがありますa.com
。
www.a.com/.well-known/acme-challenge/#######
これは AutoSSL の更新に使用されます。上記のリダイレクトにより、AutoSSL はファイルを見つけられなくなり、更新が失敗します。
では、以下のリダイレクトを無効にすることは可能でしょうか/.well-known/acme-challenge/
?
答え1
すべてを固定の URL パスにリダイレクトしているので、ディレクティブ内で例外を直接構築することもできますRewriteRule
(現在行っているように URL パスをキャプチャする必要はありません)。
例えば:
RewriteCond %{HTTP_HOST} ^(www\.)?a\.com [NC]
RewriteRule !^\.well-known/acme-challenge/ https://www.b.com/myfolder/ [R=301,L]
!
の接頭辞RewriteRule
パターン式を否定するので、正規表現がない一致します。この場合、要求された URL パスが始まっていません.well-known/acme-challenge/
。(ただし、以下の「エッジ ケース」を参照してください。)
私もあなたの2つを組み合わせました条件(ディレクティブ) を 1 つにまとめます。ルール自体にフラグRewriteCond
は必要ありません(Windows ではなく Linux を使用している場合)。NC
正規表現内のリテラルドットをバックスラッシュでエスケープすることを忘れないでください。
エッジケース(オプション追加)
ファイルの後半にフロントコントローラパターンがある場合.htaccess
(例:WordPress、Joomla、その他のほとんどのフレームワーク/CMSなど)、状態フォームの URL をリクエストするときにフロント コントローラへの書き換えがリダイレクトされるのを防ぐには、上記のルールに を追加します/.well-known/acme-challenge/<non-existent-file>
。例:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
:
この条件がない場合、 へのリクエストhttp://a.com/.well-known/acme-challenge/<non-existent-file>
は にリダイレクトされますhttps://www.b.com/index.php
(index.php
がフロント コントローラーであると想定)。
まとめ
完全なルールは次のようになります。
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} ^(www\.)?a\.com [NC]
RewriteRule !^\.well-known/acme-challenge/ https://www.b.com/myfolder/ [R=301,L]
# Front-controller pattern follows...
アップデート:
リダイレクトが単純な行である場合:
redirect 301 / https://www.b.com/myfolder/
、 の例外をどのように記述しますか/.well-known/acme-challenge/
?
以来、単純 Redirect
(mod_alias) ディレクティブ自体は「例外」を作成する機能を提供しないため、ディレクティブを式で囲む必要があります<If>
(Apache 2.4 が必要です)。例:
<If "%{REQUEST_URI} !~ m#^/\.well-known/acme-challenge/#">
Redirect 301 / https://www.b.com/myfolder/
</If>
参照:詳しくはこちら
(Redirect
このようにディレクティブを使用している場合、前述の「フロント コントローラー」パターンや「エッジ ケース」は存在しません。)
余談:似ているように見えるかもしれませんが、このRedirect
ディレクティブは以前に使用したディレクティブとはまったく異なりRewriteRule
、異なる結果を生成します。RewriteRule
上記のディレクティブ破棄する要求されたURLパスをリダイレクトし、すべてを にリダイレクトしますhttps://www.b.com/myfolder/
。ただし、Redirect
ここで使用されているディレクティブは保存する要求された URL パス。URL パスの先頭に/myfolder
(例:/foo/bar
にリダイレクトされますhttps://www.b.com/myfolder/foo/bar
)を付けます。