¿Cómo hago que todas las URL se ejecuten a través de un solo archivo PHP?

9

¿Cómo los sistemas MVC donde están las URL en estas formas fuerzan todas las solicitudes a través de un solo archivo 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

EDITAR: cuando intento las siguientes reglas de reescritura me sale este error:

[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

EDITAR: Oh, este es el contenido completo de /index.php. Cuando elimino las reglas de reescritura, genera '/' o '/index.php' o obtengo un 404 para cualquier otra cosa.

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

SOLUCIONADO: agregué un / delante de index.php en la regla de reescritura y luego funcionó:

SOLUCIONADO DE NUEVO: Resulta que / solo era necesario porque estaba ejecutando 2.2.4. Cuando actualicé a 2.2.11 el / ya no era necesario.

jmucchiello
fuente
¿Qué conjunto de reglas usaste? He probado los dos y ambos funcionan bien. ¿Estás seguro de que tienes activado mod_rewrite?
Manuel Faux el
El servidor no se iniciaría si mod_rewrite no estuviera activo. Esto es Apache 2.2 en WinXP si eso es importante.
jmucchiello

Respuestas:

12

Si está utilizando Apache, use reescrituras a través de mod_rewrite:

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

Esto reescribirá sus URL a »index.php? Q = foo / bar / baz« de forma transparente.

Las líneas 2. y 3. le indican al motor de reescritura que no reescriba la URL si apunta a un archivo o directorio existente. Esto es necesario para tener acceso a los archivos reales proporcionados por el servidor httpd.

Manuel Faux
fuente
Ver edición arriba. Obteniendo el error 400.
jmucchiello
¿Cuál fue la solicitud exacta que envió al servidor? ¿Su servidor tiene instalado mod_rewrite? Supongo que sí, porque de lo contrario no comenzará debido a un error de sintaxis.
Manuel Faux el
La edición muestra la solicitud exacta: localhost: 8181 y localhost: 8181 / abc . Si elimino las reglas de reescritura, obtengo mi index.php con / y un 404 normal con / abc.
jmucchiello
Agregué un / delante de index.php y eso solucionó el problema.
jmucchiello
Misterioso ... Lo he probado sin la barra y me funcionó con apache-2.2.11-8.
Manuel Faux el
1

El siguiente código utiliza mod_rewrite de Apache para reescribir todas las URL que no apuntan a un archivo o directorio físico que se asignará a index.php. El resultado final será:

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

Regla de reescritura:

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

Explicación:

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

Ambas líneas anteriores dictan que esta regla no se aplica a los archivos normales (-f) o directorios (-d).

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

Se puede obtener más información sobre cómo crear reglas mod_rewrite en el sitio web de Apache: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html .

nabrond
fuente
Ver edición arriba. Obteniendo el error 400.
jmucchiello
Desearía poder establecer ambas respuestas como correctas.
jmucchiello