2010-01-04 11 views
16

Mi piacerebbe per qualsiasi URL che non ha colpito un file esistente, per effettuare una ricerca sugli altri casi possibili e vedere se tali file esistono e, in caso affermativo, 302 per loro.URL insensibili alle maiuscole con mod_rewrite

Se questo non è possibile, allora io sono ok con questi compromessi:

  • solo controllare la versione minuscola
  • controlla solo la prima porzione di percorso

Per esempio http://example.com/CoOl/PaTH/CaMELcaSE dovrebbe reindirizzare http://example.com/cool/path/camelCase (supponendo che quest'ultimo esista).

ma naturalmente una soluzione completa è molto più utile per me e gli altri

+1

Preferisco utilizzare un 301 rispetto a un 302. – Gumbo

risposta

20
CheckSpelling on 

Corrisponde a file e directory. Vedi lo documentation per i dettagli.

+0

Esiste un equivalente per le versioni più recenti? – icedwater

+0

@icedwater Funziona ancora. – fuxia

+0

Non sembrava così; Ho Ubuntu 12.04 LTS, Apache 2.2.22 e la creazione di collegamenti simbolici a speling.load e speling.conf in '$ APACHE/mods-enabled /' non sembra consentire i nomi delle cartelle con il caso sbagliato. (ovviamente, speling.load e speling.conf sono impostati ... forse dovrei pubblicare un'altra domanda.) – icedwater

0

Cercare il modulo di mod_negotiation Apache. Fa esattamente quello che vuoi: http://httpd.apache.org/docs/2.0/mod/mod_negotiation.html#multiviews

Puoi anche convogliare tutte le richieste su un singolo file PHP e lasciare che il file PHP esegua il controllo per te.

+0

Questo è vicino ma sembra principalmente per l'aggiunta di estensioni. Come una richiesta di 'foo' diventa' foo.xml' o 'foo.html'. Sto cercando di correggere errori di battitura. –

4

non ho a portata di mano per testare Apache, ma una combinazione di queste regole dovrebbero fare quello che vuoi:

 
RewriteEngine on 
RewriteMap lower int:tolower 
RewriteCond ${lower:%{REQUEST_URI}} -U 
RewriteRule [A-Z] ${lower:%{REQUEST_URI}} [R=302,L] 
  • Una mappa minuscola per convertire/qualcosa da/qualcosa
  • Una condizione per vedere se la minuscola del REQUEST_URI esiste (-U è richiesta apache interno)
  • la regola di fare effettivamente la riscrittura

Non so se RewriteMap può essere applicato in una condizione o se si applica solo a una regola. Questi sono basati su experts exchange accepted answer e a small orange forum discussion.

La tua soluzione "ideale" probabilmente non è possibile a meno che non sia possibile enumerare ogni pagina valida sul tuo sito. Se hai solo poche pagine valide, una combinazione di e una mappa di testo faranno esattamente quello che ti serve. Se ci sono centinaia/migliaia di pagine potrebbe essere necessario scrivere uno script e utilizzare la direttiva prg.

Se non è possibile identificare ogni pagina valida, è necessario provare ogni variante nel caso. Considera il tuo URL come una stringa binaria, con 0 per la lettera minuscola e 1 per la maiuscola. Solo dal tuo semplice esempio dovresti testare 2^17 variazioni, 128k pagine.

Problemi correlati