2012-12-11 23 views
6

Speriamo che qualcuno può vedere quello che sto facendo male, ma qui è la storia ...rimuovere i caratteri da URL con htaccess

mio URL corrente di sono auto-generata dal software e-commerce dai nomi di prodotto e categorie di siti, quindi se il nome del prodotto/categoria include un characer non alfanumerico, questo è codificato nell'URL che è un dolore. EG:

mysite.com/Shop/Furniture-Set-Large-Table%2C-4-Chairs.html 

mi sono spostato su una nuova soluzione e-commerce, che genera automaticamente anche l'URL da nome del prodotto, ma è abbastanza intelligente per rimuovere tutti i caratteri non alfanumerici. Converte anche in lettere minuscole, che sono riuscito a trovare una soluzione htaccess per reindirizzare maiuscole a minuscole. Inoltre, non ha la parte "Shop" dell'URL, che sono anche riuscito a risolvere tramite htaccess. EG:

mysite.com/furniture-set-large-table-4-chairs.html 

Per rimuovere la parte 'Shop':

RedirectMatch 301 ^/Shop/(.*)$ http://www.mysite.com/$1 

Per sostituire maiuscole con minuscole per evitare un errore 404:

RewriteCond %{REQUEST_URI} [A-Z] 
RewriteCond %{REQUEST_FILENAME} !\.(?:png|gif|ico|swf|jpg|jpeg|js|css|php|pdf)$ 
RewriteRule (.*) ${lc:http://www.mysite.com/$1} [R=301,L] 

Questi entrambi funzionare perfettamente.

Quindi ho bisogno di una regola htaccess, o forse diversi, per rimuovere questi caratteri codificati dall'URL. Non ho bisogno di sostituirli, basta rimuoverli, perché il software crea l'URL come "Table% 2C-4-Chairs" - quindi è necessario rimuovere solo% 2C.

Ho bisogno di rimuovere alcune codifiche di caratteri dall'URL, come ad esempio:

virgola (% 2C), apostrofo (% 27), due punti (% 3A), ecc

Qualcuno può consigliare una regola htaccess adatta o regole per questo?

Grazie in anticipo.

risposta

4

L'URI è url-decodificato prima di essere inviato attraverso il motore di riscrittura, così si vuole corrispondere ai caratteri reali e non le loro controparti codificati:

stato
RewriteRule ^(.*),(.*)$ /$1$2 [L] 
RewriteRule ^(.*):(.*)$ /$1$2 [L] 
RewriteRule ^(.*)\'(.*)$ /$1$2 [L] 
RewriteRule ^(.*)\"(.*)$ /$1$2 [L] 
# etc... 

RewriteCond %{ENV:REDIRECT_STATUS} 200 
RewriteRule ^(.*)$ http://www.mysite.com/$1 [L,R=301] 

Il redirect consente mod rewrite sanno che se qualcuno di le regole di cui sopra sono state applicate (rendendo quindi il valore dello stato di reindirizzamento interno = 200), quindi dobbiamo reindirizzare, ma non raggiungeremo quella parte delle regole fino a quando non verranno cancellati tutti i controlli dei caratteri speciali.

Si consiglia di queste regole tutte prima di uno qualsiasi dei reindirizzamenti in modo che le regole possano eseguire il ciclo e rimuovere più istanze di uno di quei caratteri. Quindi, una volta che non ci sono più caratteri speciali, il motore di riscrittura può ridursi a dove sono i tuoi reindirizzamenti.

Suggerisco di rimuovere la direttiva mod_alias RedirectMatch e sostituirla con una regola di riscrittura. A volte combinando i 2 moduli e avendo entrambi influenzano un singolo URI può portare a risultati inaspettati. così prima tutte le regole di cui sopra, si avrebbe:

RewriteRule ^Shop/(.*)$ /$1 [L] 

aggiungendo la rimozione /Shop/ nella catena di caratteri speciali.Quindi la tua ultima regola sarebbe la seguente:

RewriteCond %{REQUEST_URI} [A-Z] 
RewriteCond %{REQUEST_FILENAME} !\.(?:png|gif|ico|swf|jpg|jpeg|js|css|php|pdf)$ 
RewriteRule (.*) ${lc:http://www.mysite.com/$1} [R=301,L] 
+0

Vedere il mio post originale, l'ho modificato per mostrare quello che ho nel mio file .htaccess. Ora alcuni - anche se non tutti - gli URL nel nuovo software da qualcosa come mysite.com/parent-category/sub-category/baby-category/ a mysite.com/../sub-category/baby-category/. Se ripristino il nuovo file htaccess alla versione originale, questo non accade, quindi deve essere sicuramente qualcosa che questo set di regole htaccess sta causando. Tutte le idee perché? –

+0

Ciao. Mi piacerebbe eliminare http://www.Indirizzo-it/final-cut-pro/no-quartz-extreme0-vram/" virtualsets

Problemi correlati