Obtener el mismo REQUEST_FILENAME para diferentes REQUEST_URI

Tener un problema extraño con mod_rewrite.

Un URI como /news coincidirá correctamente ya que news.php existe Sin embargo, /news/1900-01-01/title coincidirá como si fuera /news!

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !/$ #workaround for URIs ending in a slash passing the previous check
RewriteRule ^(.*)$ debug.php?page=$1.php&req_filename=%{REQUEST_FILENAME}&req_uri=%{REQUEST_URI} [L]

Si corre con /news produce el resultado esperado:

page=/news.php
req_filename=/home/domain/public_html/news
req_uri=/news

Si corre con /news/1900-01-01/title produce:

page=/news/1900-01-01/title.php
req_filename=/home/domain/public_html/news
req_uri=/news/1900-01-01/title

¿Por qué es %{REQUEST_FILENAME} lo mismo para los dos?

Ya tengo una solución alternativa para las noticias; movido RewriteRule ^news/([0-9]{4}-[0-9]{2}-[0-9]{2})/([a-zA-Z0-9\-]+)$ news-item.php?date=$1&title=$2 [L] encima de este fragmento. Sin embargo, me gustaría entender cómo 2 URI únicos pueden resolverse en el mismo archivo inexistente (el script agrega el .php).

preguntado el 22 de mayo de 12 a las 16:05

1 Respuestas

Apache intenta encontrar el directorio "real" más bajo, luego procesa las directivas correspondientes a ese directorio (por ejemplo, .htaccess u otras directivas específicas de directorio). En su caso, supongo que la URI no corresponde a ningún directorio real. Apache luego usa la negociación de contenido, y si se configuran vistas múltiples (que sospecho que es en su caso), entonces encuentra la mejor coincidencia según el nombre del archivo. Dado que tiene un news.php, eso es lo que coincide. Si desea obtener más información, puede buscar páginas que explican las palabras clave Negociación de contenido y Multivews.

contestado el 22 de mayo de 12 a las 17:05

Gracias. Eso no está claro en la documentación. No estoy seguro de la configuración completa del servidor. El sitio web del cliente está en un servidor de alojamiento compartido. - Knyri

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.