Come faccio a far funzionare tutti gli URL attraverso un singolo file PHP?


9

In che modo i sistemi MVC in cui si trovano gli URL in queste forme forzano tutte le richieste attraverso un singolo file index.php?

http://www.example.com/foo/bar/baz
http://www.example.com/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/hey/you

EDIT: Quando provo le regole di riscrittura di seguito ottengo questo errore:

[error] [client 127.0.0.1] Invalid URI in request GET / HTTP/1.1
[error] [client 127.0.0.1] Invalid URI in request GET /abc HTTP/1.1

EDIT: Oh, questo è il contenuto completo di /index.php. Quando rimuovo le regole di riscrittura, genera '/' o '/index.php' o ottengo un 404 per qualsiasi altra cosa.

<?php
echo htmlspecialchars($_SERVER['REQUEST_URI']);
?>

RISOLTO: ho aggiunto un / davanti a index.php nella regola di riscrittura e poi ha funzionato:

RISOLTO ANCORA: risulta che il / era necessario solo perché stavo eseguendo 2.2.4. Quando sono passato a 2.2.11 il / non era più necessario.


Quale set di regole hai usato? Ho provato entrambi e stanno funzionando bene. Sei sicuro di aver attivato mod_rewrite?
Manuel Faux,

Il server non si avvierebbe se mod_rewrite non fosse attivo. Questo è Apache 2.2 su WinXP se è importante.
jmucchiello,

Risposte:


12

Se si utilizza Apache, utilizzare riscrive tramite mod_rewrite:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?q=$1 [L,QSA]

Questo riscriverà i tuoi URL su »index.php? Q = foo / bar / baz« in modo trasparente.

Le righe 2. e 3. indicano al motore di riscrittura di non riscrivere l'URL se punta a un file o una directory esistenti. Ciò è necessario per avere accesso ai file reali forniti dal server httpd.


Vedi modifica sopra. Errore 400.
jmucchiello,

Qual è stata la richiesta esatta che hai inviato al server? Mod_rewrite è installato sul tuo server? Lo credo, perché altrimenti non si avvierà a causa di un errore di sintassi.
Manuel Faux,

La modifica mostra la richiesta esatta: localhost: 8181 e localhost: 8181 / abc . Se rimuovo le regole di riscrittura ottengo il mio index.php con / e un normale 404 con / abc.
jmucchiello,

Ho aggiunto un / davanti a index.php e questo ha risolto il problema.
jmucchiello,

Misterioso ... Ho provato senza la barra e ha funzionato per me con apache-2.2.11-8.
Manuel Faux,

1

Il codice seguente utilizza mod_rewrite di Apache per riscrivere tutti gli URL che non puntano a un file fisico o una directory da mappare su index.php. Il risultato finale sarà:

http://www.example.com/index.php/foo/bar/baz
http://www.example.com/index.php/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/index.php/hey/you

Regola di riscrittura:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [PT,L,QSA]

Spiegazione:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Entrambe le righe sopra indicano che questa regola non si applica ai file regolari (-f) o alle directory (-d).

RewriteRule ^(.*)$ index.php/$1 [PT,L,QSA]

Ulteriori informazioni su come creare regole mod_rewrite possono essere raccolte dal sito Web Apache: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html .


Vedi modifica sopra. Errore 400.
jmucchiello,

Vorrei poter impostare entrambe le risposte come corrette.
jmucchiello,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.