Question

J'ai un fichier htaccess qui commence par les choses régulièrement:

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

a alors quelques réécritures par exemple:

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

se termine alors avec un RewriteMap:

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

Le RewriteMap contient tous nos urls existants - pages sur notre site actuel et à court urls qui seront redirigés vers des pages équivalentes sur le nouveau site (il y a environ 4K, donc je dois utiliser une carte vraiment):

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

Le problème est, avec le RewriteMap activé (non commentée), tous mes urls (même ceux qui ne correspond pas) rediriger vers / -. Y compris les feuilles de style, js, images etc

Ce que je suis après est uri qui correspondent au modèle de la carte pour rediriger le remplacement et tout le reste à passer à travers (ie restent les mêmes).

Je l'ai essayé d'installer un défaut de 1 $ sur la carte:

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

mais cela provoque juste une boucle de redirection. Je pense que je pourrais aussi sauter la réécriture de tous Css, .js, .jpg, etc, mais préféreraient ne pas avoir à maintenir une liste des extensions de fichiers utilisés.

Pour votre information, j'utilise ISAPIRewrite de HeliconTech (comme je suis sur IIS 6) bien qu'il prétend traiter rewritemaps comme par apache et nous avons jamais eu de problèmes dans le passé.

Toute aide serait grandement appréciée!

Merci, Adam

Était-ce utile?

La solution

Il suffit de mettre uniquement les paires dans la carte qui diffèrent en réalité. Sinon, vous rediriger vers la même valeur et obtenir une récursion infinie.

Et pour rediriger uniquement lorsqu'une correspondance est trouvée, essayez ceci:

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

Autres conseils

Cette ligne est le problème:

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

Vous ne pouvez pas définir un RewriteMap dans un fichier .htaccess. (voir docs RewriteMap) Vous devez définir la carte dans le serveur ou VirtualHost contexte, et alors il peut être référencé dans votre fichier .htaccess. Si vous augmentez le niveau de journal assez haut, vous verrez un avertissement que votre carte n'est pas chargé.

La solution de Gumbo est grande, sauf qu'il ne semble pas gérer les URL avec des espaces. http://www.webmasterworld.com/apache/3830228.htm offre un aperçu comment gérer les espaces, combinant les deux comme ceci:

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

ne fonctionne pas. Bon sang, je déteste 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

adam, les règles de Gumbo inclut la barre oblique dans la clé, et la version affichée de votre carte est leur manque.

RewriteLogLevel 9 est très pratique pour découvrir des choses comme celle-ci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top