¿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.


¿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.


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 .


Ver edición arriba. Obteniendo el error 400.
jmucchiello

Desearía poder establecer ambas respuestas como correctas.
jmucchiello
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.