web-dev-qa-db-ja.com

「ugい」URLをきれいなURLにリダイレクトしますか?

たとえば、/id/123/urlugly?id=123を表示するには

RewriteRule ^id/([^/]*)$ /urlugly?id=$1 [L]

そしてどうやらリダイレクトのために私は追加することができます[R]

RewriteRule ^id/([^/]*)$ /urlugly?id=$1 [R,L]

/ id/123をリダイレクトしますto/urlugly?id = 123期待どおり。

/ urlugly?id = 123を/ id/123にリダイレクトしたい場合

RewriteRule ^urlugly?id=$ /id/([^/]*)$1  [R]
RewriteRule ^id/([^/]*)$ /urlugly?id=$1 [L]

これはうまくいくでしょう...そして私は他の似たようなことを試みましたが、ここでの私の論理は正しいと思いますが、明らかにそうではありません。

/urlugly?id=123を/ id/123にリダイレクトするにはどうすればよいですか?私はそれを動作させることができないようです。 (考えますか?)[L]は「これに一致する他の人を無視する」ことを意味し、[下]-[L]の行に当てはまると思います

すなわち、[R]を上に置いても、それはまだ機能し、[L]も機能します...これは正しいですか?

ここで間違っていることは何ですか?正しいアプローチは何ですか?

2
S00

きれいなURLをハンドラーに書き換えると同時に、ハンドラーのugいURLをきれいなURLにリダイレクトすることは困難です。 StackOverflowでそれを行う方法を尋ねる でした。

mod_rewriteはルールを複数回通過するため、[L]フラグを指定するだけでは不十分です。プリティURLを書き換えるときは、環境変数を設定する必要があります。次に、いURLをリダイレクトするかどうかを決定するときは、環境変数が設定されていない場合にのみ行います(書き換えのためにonlyいだけの場合はリダイレクトしないようにします)。このリダイレクトが評価される2回目のパスで、環境変数すべての接頭辞はREDIRECT_です。したがって、LOOP環境変数を設定する場合は、REDIRECT_LOOPとして読み取る必要があります。あなたのために働くべきものはここにあります:

RewriteEngine On

RewriteRule ^id/([^/]*)$ /urlugly?id=$1 [L,E=LOOP:1]

RewriteCond %{ENV:REDIRECT_LOOP} !1
RewriteCond %{QUERY_STRING} id=(.+)
RewriteRule ^urlugly$ /id/%1 [R,L]
1