corretto ordine di riscrittura delle regole in un file htaccess
-
12-09-2019 - |
Domanda
Ho bisogno di avere:
http://www.example.com/v1/mio-progetto/ reindirizzato a http://esempio.com/mio-progetto/
COSÌ :
(1) rimuovere www da http_host
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
(2) rimuovere la parte 'v1/' di request_uri
RewriteCond %{REQUEST_URI} ^/v1/(.*)$ [NC]
RewriteRule . %1 [R=301,L]
(3) Voglio anche reindirizzare tutti i 404 alla home page.
ErrorDocument 404 /
(4) Infine, tutti i miei documenti risiedono effettivamente in una cartella "v2/" che ospita il sito Web attualmente attivo, ma non voglio "v2" nell'URL, solo "/"
RewriteCond %{REQUEST_URI} !^/v2/ [NC]
RewriteRule ^(.*)$ /v2/$1 [NC,L]
Quindi, ecco le mie regole.La mia domanda è:non ci riesco (2):viene reindirizzato a / (a causa della regola (3), immagino.Penso che l'ordine delle mie regole debba essere errato ma non riesco a farlo bene.Puoi aiutare ?
Soluzione
La "Regola 3" non è affatto una regola e il suo ordine relativo alle tue RewriteRules non ha importanza.La regola 2 fallisce per qualche altro motivo.Non sono sicuro che risolverà il tuo problema, ma vorrei semplificare un po' le tue regole scrivendole in questo modo:
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule (.*) http://example.com/$1 [R=301,L]
RewriteRule ^v1/(.*) /$1 [R=301,L,NC]
RewriteCond %{REQUEST_URI} !^/v2/ [NC]
RewriteRule (.*) /v2/$1 [NC,L]
Altri suggerimenti
Dovresti prima scrivere qualsiasi regola che causa un reindirizzamento esterno (R
flag) e poi le altre regole.Altrimenti un URL già riscritto può essere utilizzato per un reindirizzamento esterno sebbene fosse destinato solo a un reindirizzamento interno.
Quindi non cambierò l'ordine che hai in questo momento.