2012-09-01 11 views
5

Estaba intentando eliminar las extensiones PHP de mi sitio web. Cuando el usuario solicita un archivo PHP, se eliminará el PHP y se redirigirá al usuario, y cuando el usuario escriba una URL sin PHP, se servirá el archivo PHP en sí. Esto funcionó bien, excepto cuando hay un parámetro GET en la URL. Mis reglas son las siguientes:¿Cómo usar Apache Mod_rewrite para eliminar la extensión de php, conservando los parámetros de GET?

# remove .php ONLY if requested directly 
RewriteCond %{THE_REQUEST} (\.php\sHTTP/1) 
RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA] 

# remove trailing slash ONLY if it is not an existing folder 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)/$ /$1 [L,R=301] 

# rewrite to FILENAME.php if such file does exist and is not a folder 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ /$1.php [L,QSA] 

pensé que esto ya debería ser capaz de eliminar php incluso cuando no hay ningún parámetro GET, pero fracasó. También probé algo como esto:

RewriteCond %{THE_REQUEST} (\.php\sHTTP/1) 
RewriteRule ^(.)\.php(.)$ $1$2 [R=301,L,QSA] 

También no funcionaba, el php es todavía allí. Pero si trato:

RewriteRule ^(.)\.php(.)$ $1$2 [R=301,L,QSA] 

es decir, la eliminación de la RewriteCond, la extensión php se retira y se conservaron los parámetros, pero la página no se servirá como el navegador dice que había demasiados redireccionamientos.

¿Alguien alguna idea por favor?

Respuesta

0

Es posible que desee utilizar el parámetro %{QUERY_STRING} documentado here.

Lectura útil here y here.

2

Gracias SteAp por su respuesta. He podido encontrar una manera de lidiar con esto ahora, y me gustaría compartirlo aquí en caso de que otros encuentren problemas similares.

En mis reglas, que tienen

# remove .php ONLY if requested directly 
RewriteCond %{THE_REQUEST} (\.php\sHTTP/1) 
RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA] 

Para ejecutar redirección externa cuando el usuario solicita un archivo PHP. RewriteCond aquí es para evitar bucles de redirección, es decir, redirigir sin fin debido a una reescritura interna inadecuada y redirección externa (eliminar php, luego agregar php, luego eliminar de nuevo, ...)

Cuando hay parámetros, el encabezado real viene como http://domain.com/file.php? .... HTTP/1.1 Algo así, por lo que el patrón en RewriteCond no funcionará, ya que no tiene en cuenta los parámetros.

Para solucionarlo, basta con reemplazar el código anterior con:

# remove .php ONLY if requested directly 
RewriteCond %{THE_REQUEST} (\.php(.*)\sHTTP/1) 
RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA] 

De esta manera, los parámetros pueden ser igualados por el patrón, y ahora funciona todo.

Esperamos que esto ayude a alguien teniendo problema similar

+0

en RewriteRule (o es sólo un novato como yo lol?):/$ 1 Generar URL roto, utilice $ 1 con salida / – StefanoCudini

Cuestiones relacionadas