Estoy usando mod_rewrite para reescribir URL como esta:
http://example.com/1,2,3,4/foo/
Al hacer esto en .htaccess:
RewriteEngine On
RewriteRule ^([\d,]+)/foo/$ /foo.php?id=$1 [L,QSA]
Funciona bien, excepto cuando "1,2,3,4" se convierte en una cadena de más de 255 caracteres, Apache devuelve un "403 Prohibido".
No hay ningún problema para visitar foo.php?id=1,2,3,4
directamente, incluso con una cadena de identificación muy larga, sin embargo, esta no es una opción para mí.
¿Hay algún Apache u otra configuración que deba modificar?
ACTUALIZACIÓN : encendí RewriteLog con RewriteLogLevel 9. Con una cadena de identificación corta, obtengo varias líneas en mi archivo de registro. Pero cuando la cadena de identificación es mayor que 255 caracteres, no se registra nada (¿parece que mod_rewrite ni siquiera se está ejecutando?).
Si encuentra esta pregunta interesante / útil, favor de votarla.
fuente
RewriteLog
yRewriteLogLevel
así podrá ver qué coincide y cómo se está reescribiendo realmente. Supongo que solo se están copiando 255 caracteres$1
, y eso termina siendo algoid
que el cliente no está autorizado a ver, por lo que Apache devuelve el 403. No he mirado el código, pero podría ser que Apache manipula la referencia inversa en un búfer fijo de 256 bytes (el 256 está reservado para la terminación NULL).Respuestas:
¿Crees que te estás encontrando con una limitación del sistema de archivos?
Puede que la longitud máxima del nombre de archivo sea de 255 bytes y cuando apache o la regla mod_rewrite comprueba si el archivo existe, el sistema operativo devuelve un error a apache.
Si coloca alguna regla en su archivo .htaccess, es demasiado tarde para solucionar el problema. Apache ya habrá intentado calcular el nombre del archivo y arrojó el error del sistema de archivos '(36) Nombre de archivo demasiado largo', devolviendo un error 403.
Tal vez podría cambiar el patrón de URL dentro de su aplicación. hasta un máximo de 255 caracteres de barra a barra.
EDITAR: mira aquí para obtener una respuesta detallada a este problema. Tomé prestado el mío de allí.
fuente
Hay una pregunta similar sobre este límite aquí :
No sé si está utilizando REQUEST_FILENAME en algún lugar de su configuración .htaccess, así que no sé si la solución proporcionada funcionará.
fuente
Definitivamente una pregunta interesante. ¿Ejecutas mod_security y si es así, intentaste sin él? ¿Quizás simplemente no le gustan los nombres de ruta largos o los nombres de ruta largos con comas sin codificar en ellos? ^^
Aunque instintivamente se siente más como un límite en la ruta de la URL o al menos en segmentos individuales de la misma o en la interpretación subyacente del sistema de archivos como lo escribió GmonC. Eso también explicaría por qué la url normal con la parte larga en la cadena de consulta funciona bien.
Creo que ASP.NET anterior solía tener un límite de ruta de solicitud de ~ 260 caracteres o algo así.
fuente
/usr/include/apache2/
o/usr/lib/apache2/modules/
(pero sí veo mod_rewrite allí), así que supongo que no está instalado.¿Estás dispuesto a cambiar los servidores http? Considere nginx en lugar de apache entonces.
Y use http://wiki.nginx.org/NginxHttpRewriteModule
fuente