このRewriteRuleの意味は何ですか?単純化できますか?

このRewriteRuleの意味は何ですか?単純化できますか?
RewriteRule ^he\/?(.*)$ "https\:\/\/example\.com\/$1" [R=301,L]

このRewriteRuleの意味は何ですか?単純化できますか?

私はその本を繰り返し読んで、毎回再び迷子になりました。

一致しますhe/が、残りはすべて理解できません。

答え1

説明する

heで始まるURIパスと一致します。任意に選択できる /、残りのURIパスをキャプチャします(キャプチャ角かっこセットが1つしかないためにキャプチャされます。$1)クエリ文字列がある場合はキャプチャしません。

ルールを次のように書き直しますhttps://example.com/$1

このR=301フラグは、Apacheに永続的なリダイレクトコード(301)を使用するように指示します。このLフラグは、ApacheにこのURIパスへの追加の書き換え規則の処理を停止するように指示します。つまり、それ以上のルールがある場合、パターンと一致しても適用されません。

つまり、次からhe始まるすべてのURIをリダイレクトします。he/ orhttps://example.com/he/foo.htmlhttps://example.com/foo.html

単純化する

ModRewriteルールのパターンや置換にはスラッシュをエスケープする必要がないため、次のように単純化できます。

RewriteRule ^he/?(.*)$ https://example.com/$1 [R=301,L]

ちなみに、これがhe/ドキュメントルートのサブディレクトリにあるすべてをリダイレクトすることであれば、そうします。そうだろう返品で始まるドキュメントルートの.htmlまたはその他のファイルをキャプチャします(he例:hello.htmlにリダイレクトされます)https://example.com/llo.html

これをしたくない場合は、?削除してください/。正規表現では、?前の要素を0または1回一致させることを意味します(つまり、一致はオプションです)。パターンマッチングを必須に設定するには、オプションとして作成するのでは/なく、代わりに次を使用します。

RewriteRule ^he/(.*)$ https://example.com/$1 [R=301,L]

ただし、heuriがで終わらない場合は、/次のものが必要です。

RewriteRule ^he($|/.*$) https://example.com$1 [R=301,L]

IMO、上記のルールはおそらくあなたが本当に欲しいものです...しかし、あなたが/望むものがオプションであれば、/?それはパターンには必要ありません。それはまだ/afterがあってもなくてもURIと一致しますhe

RewriteRule ^he(.*)$ https://example.com/$1 [R=301,L]

URIの問題?

最後に、あなたのApacheサーバーがどのように設定されているかはわかりませんが、Apacheの書き換え規則によって示されるURIは通常で始まるので、パターンの前に/サーバーがあるべきだと思います。たとえば、次のようになります。he/

RewriteRule ^/he($|/.*$) https://example.com$1 [R=301,L]

関連情報