Las URL reescritas con longitud de parámetro> 255 no funcionan

12

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,4directamente, 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.

philfreo
fuente
¿Podría ser esto un problema de expresiones regulares? ¿Ha verificado que la solicitud reescrita es correcta para cadenas de más de 255 caracteres? Si no, tal vez podría publicar las solicitudes de reescritura previa y posterior.
tomjedrz
3
Habilite el registro de mod_rewrite con RewriteLogy RewriteLogLevelasí 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 algo idque 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).
James Sneeringer
Consulte la actualización en cuestión: no se registra nada durante los parámetros largos
philfreo

Respuestas:

8

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

microspino
fuente
Sí, actualmente esto es todo lo que podemos hacer, aunque espero una solución o ajuste.
philfreo
3
Microspino, parece que cortó y pegó parte de su respuesta de la respuesta de @Jeff Clark aquí: serverfault.com/questions/120397/… . Debes hacer un hipervínculo a esa respuesta, para que tenga cierta notoriedad.
Stefan Lasiewski
@Stefan lasieswski: tienes razón, agregué una referencia.
microspino
entonces, está pensando que quizás Apache está tratando de obtener el archivo solicitado independientemente, es decir, esa podría ser la única forma de explicar que la URL demasiado larga ni siquiera está siendo recogida por el motor de reescritura ...
HorusKol
Sí, esta es mi idea, aunque creo que, en general, se debe evitar tener URL y nombres de archivo tan largos por varias razones. Entonces, el mejor consejo que podría pensar es cambiar algo en el patrón de URL si el nombre de archivo no es demasiado largo.
microspino
2

Hay una pregunta similar sobre este límite aquí :

Es posible que se encuentre con una limitación del sistema de archivos subyacente

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

GmonC
fuente
Eso tiene sentido, pero no, no lo soy. Edité mi pregunta para incluir el archivo .htaccess en su totalidad. ¿Otras ideas?
philfreo
De acuerdo con "Detalles técnicos de Apache mod_rewrite" en httpd.apache.org/docs/trunk/rewrite/tech.html "Aunque mod_rewrite reescribe URL a URL, URL a nombres de archivo e incluso nombres de archivo a nombres de archivo, la API actualmente solo proporciona una URL a -nombre de archivo gancho ". Entonces, a pesar de que no está golpeando un archivo real, ¿tal vez la URL al enlace de nombre de archivo está alcanzando el límite de recursos del sistema operativo?
Stefan Lasiewski
0

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

Oskar Duveborn
fuente
Ver actualización de la pregunta. Y no, no veo un archivo mod_security /usr/include/apache2/o /usr/lib/apache2/modules/(pero sí veo mod_rewrite allí), así que supongo que no está instalado.
philfreo