2

これらの書き換えルールを使用して、動的 URL から静的 URL に移行しています。

RewriteEngine On
RewriteRule ^songs/album/([^/]*)\.html$ /index.html?album=$1 [L,QSA]

古い URL: http://example.com/index.html?album=rockstar 新しい URL: http://example.com/songs/album/rockstar.html

しかし、古い URL を新しい URL にリダイレクトしようとしても、うまくいきません。

RedirectMatch 301 ^/index.html?album=(.*)\$ http://example.com/songs/album/$1.html

何か案は?

4

1 に答える 1

0

RedirectMatchmod_aliasのディレクティブはクエリ文字列とは一致せず、その/index.html部分のみが一致します。RewriteCond ${QUERY_STRING} <regexp>それに対して一致させるには a を使用する必要があります。しかし、そのようにリダイレクトすると、URI が変更されないままになるまで URI が書き換えエンジンを通過するため、ループが発生します。

  1. ユーザーは URL アドレス バーに http://example.com/index.html?album=rockstar と入力します
  2. ブラウザがhttp://example.com/songs/album/rockstar.htmlにリダイレクトされる
  3. mod rewrite は/songs/album/rockstar.htmlそれを見て書き換えます/index.html?album=rockstar
  4. リダイレクト ルールは正常に一致します/index.html?album=rockstar
  5. 手順 2 から繰り返します。

/index.html?album=rockstar実際のリクエストが に対するものであり、書き換えエンジンを通過したときではない場合にのみリダイレクトするようにする必要があります。

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\?album=(.+)\ HTTP
RewriteRule ^index\.html$ http://example.com/songs/album/%1.html? [R=301,L]

%{THE_REQUEST}は実際の HTTP 要求であり、書き換えられた URI ではありません。%1は、前の一致への後方参照でありRewriteCond? リダイレクト URL の最後にある はRewriteRule、クエリ文字列を末尾に追加しないように指示します。

于 2012-04-13T07:08:16.533 に答える