2010-01-04 4 views
16

Je voudrais pour toute URL qui ne frappe pas un fichier existant, faire une recherche sur les autres cas possibles et voir si ces fichiers existent, et si oui, 302 à eux.URL avec insensible à la casse avec mod_rewrite

Si ce n'est pas possible, alors je suis ok avec ces compromis:

  • vérifier Seule la version minuscule
  • vérifier uniquement la première partie de trajet

Par exemple http://example.com/CoOl/PaTH/CaMELcaSE devrait rediriger vers http://example.com/cool/path/camelCase (en supposant que ce dernier existe).

mais bien sûr, une solution complète est beaucoup plus utile pour moi et d'autres

+1

Je préfère utiliser un 301 plutôt qu'un 302. – Gumbo

Répondre

20
CheckSpelling on 

Correspond à des fichiers et des répertoires. Voir le documentation pour plus de détails.

+0

Existe-t-il un équivalent pour les versions plus récentes? – icedwater

+0

@icedwater Cela fonctionne toujours. – fuxia

+0

Ne semblait pas comme ça; J'ai Ubuntu 12.04 LTS, Apache 2.2.22 et la création de liens symboliques vers speling.load et speling.conf dans '$ APACHE/mods-enabled /' ne semble pas autoriser les noms de dossier avec le mauvais cas. (bien sûr, speling.load et speling.conf sont mis en place ... peut-être que je devrais poster une autre question.) – icedwater

0

Consulter le module Apache mod_negotiation. Il fait exactement ce que vous voulez: http://httpd.apache.org/docs/2.0/mod/mod_negotiation.html#multiviews

Vous pouvez également rediriger toutes les demandes vers un seul fichier PHP et laisser le fichier PHP faire la vérification pour vous.

+0

C'est proche mais semble surtout pour ajouter des extensions. Comme une requête pour 'foo' devient' foo.xml' ou 'foo.html'. J'essaie de corriger les fautes de frappe. –

4

Je n'ai pas Apache pratique pour tester, mais une combinaison de ces règles devraient faire ce que vous voulez:

 
RewriteEngine on 
RewriteMap lower int:tolower 
RewriteCond ${lower:%{REQUEST_URI}} -U 
RewriteRule [A-Z] ${lower:%{REQUEST_URI}} [R=302,L] 
  • Une carte minuscule pour convertir/QUELQUE CHOSE/quelque chose
  • Une condition pour voir si le minuscule du REQUEST_URI existe (-U requête apache interne)
  • la règle à faire en fait la réécriture

Je ne sais pas si le RewriteMap peut être appliqué dans une condition, ou s'il ne s'applique qu'à une règle. Ceux-ci sont basés sur experts exchange accepted answer et a small orange forum discussion.

Votre solution "idéale" n'est probablement pas possible à moins que vous ne puissiez énumérer toutes les pages valides sur votre site. Si vous n'avez que quelques pages valides, une combinaison de RewriteMap et d'un text map fera exactement ce dont vous avez besoin. S'il existe des centaines/milliers de pages, vous devrez peut-être écrire un script et utiliser la directive prg.

Si vous ne pouvez pas identifier toutes les pages valides, vous devez essayer chaque variante au cas où. Considérez votre URL comme une chaîne binaire, avec 0 pour les minuscules et 1 pour les majuscules. Juste à partir de votre exemple simple, vous devrez tester 2^17 variations, 128k pages.