2011-03-17 20 views
8

Recientemente hemos empezado a ver un nuevo error en nuestros registros de Apache:Apache de error: Nombre de archivo demasiado largo: No se puede asignar GET

[Wed Mar 16 08:32:59 2011] [error] [client 10.40.1.2] (36)File name too long: Cannot map GET /static/app/js <..lots of javascript...> 

Parece que JavaScript de una página que se está enviando una solicitud para el servidor. Sin embargo, no está claro cómo ocurriría esto. Desde la búsqueda de t'internet, parece que este tipo de cosas ha ocurrido con ciertos plugins de WordPress, pero no hay mucha otra información por ahí.

Nota sobre el entorno: los clientes utilizan IE8 ejecutándose en un Thin Client de Citrix en el Reino Unido. Los servidores web están a 1700 km de distancia, por lo que hay un poco de latencia. El sitio hace un uso intensivo de AJAX y cookies grandes.

¿Alguien podría aconsejar sobre cómo solucionar este problema, por favor?

Gracias

Andrew

+0

¿Eso '<.. muchos javascript ..> 'significa que tienes un montón de' & file.js & file2.js' al final del mismo? Si es así, entonces tendrá que acortarlo. Sería más útil si especificas qué plugin estás usando y qué tiene '<.. muchos javascript ..>' en él? (¿Simplemente código de JavaScript?) – Haochi

+0

El <.. montón de javascript ..> es el código fuente de JavaScript, no los nombres de archivo. –

Respuesta

6

Me estoy poniendo esto también, con un marco de PHP que permite a las URL formateados de manera que

index.php?controller=doohickey&id=z61 

puede reescribirse como

index.php/controller/doohickey/z61 

lo largo con una expresión regular en el código de la estructura.

Los errores se parece a (/ var/log/apache/error_log):

GET /index.php/accounts_badoink/confirmaction/WUW%253DWBW%25253DV0tXPWM3Nzc1.... 

-> en este caso, Apache está analizando el nombre de archivo como

/index.php/accounts_badoink/confirmaction/WUW%253DWBW%25253DV0tXPWM3Nzc1.... 

(estoy serializar un estado de objeto y pasándolo alrededor).

que tienen que volver a escribir esto (al menos las direcciones URL con objetos serializados largo adjuntas) al estilo más-habitual:

GET /index.php?controller=accounts_badoink&confirmaction=WUW%253DWBW%25253DV0tXPWM3Nzc1.... 

-> en este caso, Apache está analizando el nombre de archivo como index.php

En resumen, reescriba sus URL e incluya un ? tan pronto como sea posible, para pasar datos como parámetros de estilo CGI en lugar de elementos de ruta.

Corrí strace -p $PID & para cada identificador de proceso Apache (según lo informado por pidof apache2):

# pidof apache2 | tr ' ' '\n' | grep -v 21561 | sed "s|\(.*\)|strace -p \1 \&|g" | sh - 

a fin:

# kill -HUP `pidof strace` 

y ver las llamadas al kernel hacen por apache2:

accept(3, {sa_family=AF_INET, sin_port=htons(38985), sin_addr=inet_addr("127.0.0.1")}, [16]) = 13 
fcntl(13, F_GETFD)      = 0 
fcntl(13, F_SETFD, FD_CLOEXEC)   = 0 
fcntl(13, F_GETFL)      = 0x2 (flags O_RDWR) 
fcntl(13, F_SETFL, O_RDWR|O_NONBLOCK) = 0 
read(13, "GET /newregcon/index.php/account"..., 8000) = 4949 
write(2, "[Wed May 11 15:39:36 2011] [erro"..., 4451) = 4451 
writev(13, [{"HTTP/1.1 403 Forbidden\r\nDate: We"..., 219}, {"<!DOCTYPE HTML PUBLIC \"-//IETF//"..., 4610}], 2) = 4829 

Como estas llamadas al sistema no devuelven errores (p. Ej. '...= -1'), he descargado las fuentes apache2, y encontré:

Grep para "No se puede asignar":

server/core.c

3489:AP_DECLARE_NONSTD(int) ap_core_translate(request_rec *r) 
3490:{ 

3520:  if ((rv = apr_filepath_merge(&r->filename, conf->ap_document_root, path, 
3521:          APR_FILEPATH_TRUENAME 
3522:         | APR_FILEPATH_SECUREROOT, r->pool)) 
3523:     != APR_SUCCESS) { 
3524:   ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, 
3525:       "Cannot map %s to file", r->the_request); 
3526:   return HTTP_FORBIDDEN; 
3527:  } 

look para apr_filepath_merge ...

srclib/apr/file_io/unix/filepath.c

81:APR_DECLARE(apr_status_t) apr_filepath_merge(char **newpath, 
82:            const char *rootpath, 
83:            const char *addpath, 
84:            apr_int32_t flags, 
85:            apr_pool_t *p) 
86:{ 
87: char *path; 
88: apr_size_t rootlen; /* is the length of the src rootpath */ 
89: apr_size_t maxlen; /* maximum total path length */ 

149: rootlen = strlen(rootpath); 
150: maxlen = rootlen + strlen(addpath) + 4; /* 4 for slashes at start, after 
151:            * root, and at end, plus trailing 
152:            * null */ 
153: if (maxlen > APR_PATH_MAX) { 
154:  return APR_ENAMETOOLONG; 
155: } 

buscar APR_PATH_MAX ...

Netware

./srclib/apr/include/apr.hnw:424:#define APR_PATH_MAX PATH_MAX 

WIN32

./srclib/apr/include/apr.hw:584:#define APR_PATH_MAX 8192 

./srclib/apr/include/apr.h.in

/* header files for PATH_MAX, _POSIX_PATH_MAX */ 
#if APR_HAVE_LIMITS_H 
#include <limits.h> 

/usr/src/linux -headers-2.6.35-28/include/linux/limits.h

#define PATH_MAX  4096 /* # chars in a path name including nul */ 
Cuestiones relacionadas