4

次の永続的なリダイレクトを処理するために、 ISAPI_Rewrite 3 "RewriteRule "を作成したいと思います。

╔════════════════════════════════╦════════════════════════════╗
║             Input              ║           Redirect         ║
╠════════════════════════════════╬════════════════════════════╣
║ /path/?a=foo&b=bar             ║ /path/foo/bar/             ║
║ /path/?b=baz&a=qux             ║ /path/qux/baz/             ║
║ /path/?c=1&a=foo&d=2&b=bar&e=3 ║ /path/foo/bar/?c=1&d=2&e=3 ║
╚════════════════════════════════╩════════════════════════════╝

例えば;

RewriteCond ${QUERY_STRING} (?:^|&)a=([\w]+)(?:&|$)
RewriteCond ${QUERY_STRING} (?:^|&)b=([\w]+)(?:&|$)
RewriteRule ^/path/$ /path/%1/%2/? [R=301]

ただし、すべてのクエリ文字列のペアが削除されます (3 番目の例では失敗します)。URL から既知のキーと値のペアのみを削除するための洗練されたソリューションを見つけられないようです。そして、何か...

RewriteCond ${QUERY_STRING} ^(.*)&?a=([\w]+)(.*)&?b=([\w]+)(.*)$
RewriteRule ^/path/$ /path/%2/%4/?%1%3%5 [R=301]

正確には正しくありません (ただし、この例が何をしようとしているのかを理解する必要があります)。

何か案は?

明確化: 3 番目の例では、 のリクエストはand NOT/path/?c=1&a=foo&d=2&b=bar&e=3にリダイレクトする必要があります。どのクエリ文字列のペアが要求されるか分からない場合があり、そのうちのいくつかは、クライアント側の処理のためにクエリ文字列にとどまる必要がある場合があります。不明なクエリ文字列キーの例は次のとおりです。/path/foo/bar/?c=1&d=2&e=3/path/foo/bar/1/2/3/

  • gclid」 - Google アナリティクス (GA) クライアント スクリプトで使用され、Adwords データに結び付けられます
  • " utm_source " - トラフィックのソース/タイプを GA に明示的に伝えるために使用されます
4

2 に答える 2

0

面白いですね!私の経験では、面倒なルールを 1 つ持つよりも、いくつかの単純な条件を用意したほうがよいことがわかります。通常は、より効果的かつ効率的です。

私のおすすめ:

# a-b pair
RewriteCond %{QUERY_STRING} a=([^&]+)
RewriteCond %{QUERY_STRING} b=([^&]+)
RewriteRule ^/path/$ /path/%1/%2/? [NC,R=301,L]

# a-b-c pair
RewriteCond %{QUERY_STRING} a=([^&]+)
RewriteCond %{QUERY_STRING} b=([^&]+)
RewriteCond %{QUERY_STRING} c=([^&]+)
RewriteRule ^/path/$ /path/%1/%2/%3/? [NC,R=301,L]

これはあなたが望むほどエレガントではないかもしれませんが、それでもうまくいくはずです。さらにいくつかのアプローチを考え出すこともできます

于 2013-05-21T03:45:44.110 に答える