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?

È stato utile?

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:

  1. Entra "http://www.example.com/whatever.php" nella barra degli indirizzi
  2. apache ti reindirizza a "http://www.example.com/whatever/"
  3. apache ottiene l'URI Va beh/ e applica la prima regola e l'URI viene riscritto in /qualunque.PHP
  4. L'URI viene nuovamente inserito nel motore di riscrittura
  5. l ' URI /qualunque.PHP corrisponde alla seconda regola e reindirizza il browser a "http://www.example.com/whatever/"
  6. 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top