.htaccess mod_rewrite collegamento alla pagina sbagliata
-
09-12-2019 - |
Domanda
Ho nel mio .htaccess il seguente codice:
RewriteEngine On
RewriteRule ^/?([^/\.]+)/?$ $1.php [L]
RewriteRule ^/?([^/\.]+).php$ $1/ [R,L]
RewriteRule ^/?([^/\.]+)/?$ $1.php [L]
sta funzionando bene.Quello che sta facendo è prendere un URL come http://www.example.com/whatever
e facendolo leggere la pagina come http://www.example.com/whatever.php
.
Tuttavia, quello che mi piacerebbe essere in grado di fare è prendere un URL come http://www.example.com/whatever.php
e inviarlo automaticamente a http://www.example.com/whatever
, da qui la seconda riga del codice.Tuttavia, questo non funziona.Quello che sta facendo ora, è non appena si imbatte in un link che termina in .php
, l'url diventa http://localhost/C:/Sites/page/whatever/
, e tirando un 403: Forbidden
pagina.
Tutto quello che voglio sapere è quello che posso fare in modo che http://www.example.com/whatever.php
sarà letto come http://www.example.com/whatever
, e che se http://www.example.com/whatever.php
viene inserito nella barra degli URL, reindirizzerà automaticamente a http://www.example.com/whatever
.
Ha senso?
MODIFICARE
Ok, quindi sembra che non sia stato troppo chiaro..fondamentalmente, voglio /whatever/
da leggere come whatever.php
mentre l'URL rimane come /whatever/
, giusto?Se l'URL è /whatever.php
, Voglio che in realtà reindirizzare gli utenti URL a /whatever/
, e poi ancora una volta leggerlo come whatever.php
.E ' possibile?
Soluzione
Se sei regole sono all'interno di un .file htaccess, è possibile omettere la barra iniziale quando si corrisponde a un URI:
RewriteRule ^([^/\.]+)/?$ /$1.php [L]
Si noti inoltre che una barra iniziale è inclusa nel target (/$1.php
), questo assicura /qualunque/ viene riscritto in /qualunque.PHP.Quando si reindirizza, se manca questa barra iniziale, apache antepone la radice del documento ad essa.Cosi /qualunque.PHP viene reindirizzato alla radice del documento C:/Sites/page/whatever/.Anche se includi la barra principale, questo non funzionerà mai perché causerai un ciclo di reindirizzamento:
- Entra "http://www.example.com/whatever.php" nella barra degli indirizzi
- apache ti reindirizza a "http://www.example.com/whatever/"
- apache ottiene l'URI Va beh/ e applica la prima regola e l'URI viene riscritto in /qualunque.PHP
- L'URI viene nuovamente inserito nel motore di riscrittura
- l ' URI /qualunque.PHP corrisponde alla seconda regola e reindirizza il browser a "http://www.example.com/whatever/"
- ripetere i passaggi 3-5
È necessario aggiungere una condizione che il richiesta effettiva è per /qualunque.PHP:
RewriteCond %{THE_REQUEST} ^(GET|POST|HEAD)\ /([^/\.]+)\.php
RewriteRule ^ /%2/ [R,L]
Quindi, nel complesso, avrai:
RewriteEngine On
RewriteRule ^([^/\.]+)/?$ /$1.php [L]
RewriteCond %{THE_REQUEST} ^(GET|POST|HEAD)\ /([^/\.]+)\.php
RewriteRule ^ /%2/ [R,L]
Altri suggerimenti
Stai effettuando una sostituzione del percorso relativo in un contesto per directory (.htaccess
è un contesto per-directory).Ciò richiede RewriteBase
.Le riscritture per directory vengono eseguite in una fase successiva dell'elaborazione, quando gli URL sono stati mappati ai percorsi.Ma la riscrittura deve produrre un URL, che viene elaborato di nuovo.Penso che senza il RewriteBase
per fornire il prefisso URL, si finisce con un prefisso del filesystem invece dell'URL.Questo potrebbe essere il motivo per cui stai ricevendo il C:/Sites
cosa.Provare RewriteBase
.Ma dopo una corretta RewriteBase
per specificare il prefisso URL corretto da incollare davanti alla parte riscritta relativa, temo che avrai il ciclo di riscrittura, perché stai riscrivendo whatever.php
per whatever
;e whatever
per whatever.php
.
Riferimento: http://httpd.apache.org/docs/current/rewrite/tech.html