¿Cómo cambiar mod_rewrite para evitar {REQUEST_FILENAME} y superar el límite de URL de 255 caracteres?

¿Cómo cambiar mod_rewrite para evitar {REQUEST_FILENAME} y superar el límite de URL de 255 caracteres?

Según esta respuesta:¿La longitud máxima de la URL es de 257 caracteres para mod_rewrite?Existe un límite máximo de 255 caracteres según el sistema de archivos para usar mod_rewrite.

Según la respuesta aceptada, existen dos soluciones:

  1. Cambie el formato de URL de su aplicación a un máximo de 255 caracteres entre cada barra.
  2. Mueva las reglas de reescritura a la configuración del host virtual de Apache y elimine REQUEST_FILENAME.

No puedo utilizar el primer método, así que estoy intentando descubrir el segundo.

Puse las reglas de reescritura en la configuración del host virtual Apache según lo solicitado. Sin embargo, no puedo entender cómo eliminar REQUEST_FILENAME y aún así hacer que mi marco de aplicación web (Dragonfly) siga funcionando.

Aquí está la parte de las reglas de reescritura que moví de .htaccess al archivo de configuración del host virtual de Apache:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f [OR]

# if don't want Dragonfly to process html files comment
# out the line below (you may need to remove the [OR] above too).
RewriteCond %{REQUEST_FILENAME} \.(html|nl)$

# Main URL rewriting.
RewriteRule (.*) index.cgi?$1 [L,QSA]

Intenté eliminar {REQUEST_FILENAME} y simplemente rompe el marco de varias maneras. ¿Cómo reescribo esto sin usar {REQUEST_FILENAME}?

Respuesta1

Las tres líneas siguientes le dicen a Apache que verifique el sistema de archivos para ver si el archivo existe.

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f [OR]

El primero significa "si el URI no es un directorio". El segundo significa "si el URI no es un enlace". El tercero significa "si el URI no es un archivo".

Si elimina o comenta esas líneas, Apache aplicará la reescritura siguiente a cada archivo que no termine en ".html" o ".nl" y no comprobará el sistema de archivos para ver si el archivo existe primero.

Las tres líneas anteriores tienen un propósito. Están ahí para que si agrega un archivo, directorio o enlace simbólico real a la raíz de su documento y alguien solicita ese archivo, directorio o enlace simbólico, Apache lo procesará normalmente y no lo reescribirá. Si sabe que nunca agregará archivos reales a la raíz del documento, puede comentarlos de forma segura y sin efectos secundarios.


Un cambio potencialmente mejor sería agregar una nueva regla encima de las tres líneas como esta:

RewriteRule (.*[^/]{255}.*) index.cgi?$1 [L,QSA]

Esto interceptará cualquier URI que tenga una sola cadena de más de 255 caracteres entre barras y los enviará directamente a la reescritura sin verificar el sistema de archivos. La opción [L] garantiza que Apache no verifique más reglas si coincide con ésta. No hay peligro de interceptar URI que se habrían asignado a archivos reales porque los URI que coincidan con esta expresión regular no serán rutas de archivo válidas.

Actualizar:

Una expresión regular que coincide con cualquier URI que tenga al menos 255 caracteres.

RewriteRule (.{255}) index.cgi?$1 [L,QSA]

Respuesta2

Lo siguiente funciona para mí (probado en el host virtual predeterminado en Debian con Apache 2.2.21).

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} (.{255}) [OR]
RewriteCond %{REQUEST_FILENAME} \.(html|nl)$ [OR]
RewriteCond %{REQUEST_FILENAME} !-d [OR]
RewriteCond %{REQUEST_FILENAME} !-l [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /index.cgi?$1 [L,QSA]

información relacionada