3

通常のもので始まるhtaccessファイルがあります:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

次に、いくつかの書き換えがあります。

RewriteRule ^protect/?$ /Legal/Your-Financial-Protection.aspx   [NC, L, R=301]

その後、rewritemap で終了します。

RewriteMap map txt:rewritemaps/map.txt  [NC]
RewriteRule ^(.+)$  ${map:$1}   [R=301]

rewritemap には、すべての従来の URL (現在のサイトのページと、新しいサイトの同等のページにリダイレクトされる短い URL) が含まれています (約 4k あるため、マップを実際に使用する必要があります)。

Inspiration.aspx /Inspiration.aspx
Destinations/Africa/Countries/Gabon.aspx /Destinations/Africa/Gabon.aspx
indonesia /Destinations/Southeast-Asia/Indonesia.aspx

問題は、rewritemap が有効になっている (つまり、コメントアウトされていない) 場合、すべての URL (一致しないものも含む) が / にリダイレクトされ、スタイルシート、js、画像などを含むことです。

私が求めているのは、マップ内のパターンに一致する uris が置換にリダイレクトされ、他のすべてが通過する (つまり、同じままである) ことです。

マップにデフォルトの $1 を設定してみました:

RewriteRule ^(.+)$  ${map:$1|$1}    [R=301]

しかし、これはリダイレクト ループを引き起こすだけです。すべての .css、.js、.jpg などの書き換えをスキップすることもできると思いますが、使用されているファイル拡張子のリストを維持する必要はありません。

参考までに、私は HeliconTech の ISAPIRewrite を使用していますが (私は IIS 6 を使用しているため)、Apache に従って rewritemaps を処理すると主張しており、過去に問題が発生したことはありません。

どんな助けでも大歓迎です!

ありがとう、アダム

4

4 に答える 4

2

実際に異なるペアのみをマップに配置するだけです。そうしないと、同じ値にリダイレクトされ、無限再帰が発生します。

一致が見つかった場合にのみリダイレクトするには、次のようにします。

RewriteCond ${map:$1} ^/.+
RewriteRule ^(.+)$ %0 [R=301]
于 2009-12-15T20:29:18.470 に答える
2

この行が問題です:

RewriteMap map txt:rewritemaps/map.txt  [NC]

.htaccess ファイルで RewriteMap を定義することはできません。(RewriteMap のドキュメントを参照してください)サーバーまたは仮想ホストのコンテキストでマップを定義する必要があり、.htaccess ファイルで参照できます。ログ レベルを十分に高くすると、マップが読み込まれていないという警告が表示されます。

于 2016-01-31T17:06:36.040 に答える
1

Gumboのソリューションは、スペースを含むURLを処理しないように見えることを除けば、優れています。 http://www.webmasterworld.com/apache/3830228.htmは、スペースを処理する方法についての洞察を提供し、次のように2つを組み合わせます。

  RewriteCond ${moved:${escape:$1}} ^/.+
  RewriteRule ^(.+)$ %0 [R=301]

動作しません。くそー私はmod_rewriteが嫌い

  IPADDR - - [07/Jan/2010:01:44:58 --0500] [example.org/sid#842a5a8][rid#100e0a18/initial] (2) init rewrite engine with requested uri /press/Partners With City.pdf
  IPADDR - - [07/Jan/2010:01:44:58 --0500] [example.org/sid#842a5a8][rid#100e0a18/initial] (3) applying pattern '^(.+)$' to uri '/press/Partners With City.pdf'
  IPADDR - - [07/Jan/2010:01:44:58 --0500] [example.org/sid#842a5a8][rid#100e0a18/initial] (5) map lookup OK: map=escape key=/press/Partners With City.pdf -> val=/press/Partners%20With%20City.pdf
  IPADDR - - [07/Jan/2010:01:44:58 --0500] [example.org/sid#842a5a8][rid#100e0a18/initial] (6) cache lookup FAILED, forcing new map lookup
  IPADDR - - [07/Jan/2010:01:44:58 --0500] [example.org/sid#842a5a8][rid#100e0a18/initial] (5) map lookup FAILED: map=moved[txt] key=/press/Partners%20With%20City.pdf
  IPADDR - - [07/Jan/2010:01:44:58 --0500] [example.org/sid#842a5a8][rid#100e0a18/initial] (4) RewriteCond: input='' pattern='^/.+' => not-matched
于 2010-01-07T06:57:11.890 に答える
1

adam さん、Gumbo のルールにはキーの先頭のスラッシュが含まれていますが、投稿されたバージョンのマップにはそれらがありません。

RewriteLogLevel 9 は、このようなことを明らかにするのに非常に便利です。

于 2010-01-08T03:12:36.550 に答える