URL ottenuto troncato a 255 caratteri

Ho un widget JavaScript che comunica con l'applicazione Rails creando tag nel DOM. Ogni tanto, vedo una richiesta malformata nei miei registri del server, where l'URL è troncato a 255 caratteri:

http://myapplication.example/mycontroller/1/myaction?hostname=www.mycustomer.example&request[param_a]=3&request[param_b]=1&request[param_c]=0&request[param_d]=0&request[param_e]=3&request[param_f]=1&request[param_g]=4&request[param_h]=0&request[param_i]=5&request 

Da Google e Stackoverflow ( Qual è la lunghezza massima di un URL in diversi browser? ), Sembra che 255 caratteri non siano un limite valido per gli URL.

Ecco quello che so:

  • Questo è un problema sporadico, non succede in tutte le richieste
  • L'URL viene troncato a 255 caratteri quando questo accade
  • Quando si verifica questo errore, l'agente utente non viene registrato nel backtrace

Ecco quello che non so:

  • Quali tipi di browser fa questo errore? Forse qualche browser mobile …

Qual è il modo migliore per root causare questo problema?

Il modo migliore per risolvere la causa principale è non farlo un GET ma una richiesta POST.

Non esiste AFAIK nessun limite impostato sulla lunghezza di un QueryString, quindi il limite reale è tutto il luogo. So che 4000 è un limite per alcuni server web (non riesco a ricordare se è stato IIS o Apache e se potrebbe essere cambiato), ma è molto probabile che alcuni browser abbiano limiti molto più piccoli. Il fatto che non si ottiene un utente-agente potrebbe sottolineare che si tratta di un browser mobile, crawler o un'altra applicazione piuttosto che un vero browser.

Le richieste POST sono un po 'più complesse da fare, ma possono portre molto più grandi "payload" e possono essere configurati sul lato server.

Non so perché potrebbe accadere, RFC 2068 afferma:

I server devono essere prudenti a seconda delle lunghezze URI superiori a 255 byte, perché alcune implementazioni client o proxy più recenti potrebbero non supportre correttamente queste lunghezze.

Potrebbe essere il server che maneggia i params GET lunghi, o potrebbe essere che i browser vecchi (possibilmente IE6) stanno troncando i params prima di inviarli nella speranza di evitare le richieste fallite del server.

Tuttavia, non esiste limiti alle lunghezze di richiesta POST in qualsiasi browser o server (che sono a conoscenza), quindi questa è probabilmente una soluzione di lavoro garantita.

Modifica: questo collegamento indica che alcuni browser non impongono limiti alle lunghezze delle stringhe di query, tuttavia sembrano essere abbastanza lunghe. Forse i browser mobili limitano la lunghezza a ~ 255 per conservare la memory, in quanto è in quantità più limitata.

Ho visto questo accadere nei miei log di accesso. Esistono alcuni IP molto specifici che generano richieste troncate. Guardando tutto il traffico da questi IP mostra che ci sono anche richieste non troncate, che hanno stringhe agente utente. Alcuni di essi hanno più stringhe dell'agente utente (anche se non ho visto più di 2 uniques – Safari 5.0.5 / Mac 10.6.8 e IE 9.0 / NT 6.1) si mostrano in pochi minuti l'uno dall'altro. Inoltre, in tutti i casi tranne due, vedo una buona richiesta seguita da una brutta richiesta circa 50 ms dopo, where la ctriggers richiesta è identica alla buona richiesta, ma tronca a 255 byte. I restanti 2 casi hanno la ctriggers richiesta prima della buona richiesta. Uno dei IP è da AT & T Worldnet che suggerisce che potrebbe essere un gateway mobile, ma gli altri sembrano solo ISP, università o aziende.

Non so cosa posso dire da questo ancora. È molto improbabile che Safari 5 e IE 9 si visualizzino dallo stesso IP. Le tre possibilità sono un Windows VM su Mac OSX, l'IP è un gateway e che due utenti diversi hanno fatto richieste attraverso di essa o che qualcuno sta messo con me. Sembra un po 'strano che si otterrebbe solo due utenti che arrivano attraverso un gateway, e il visitatore demografico per questo sito particolare non è probabile che sia in esecuzione VM (anche se non è imansible), alless non per questo task particolare.

Il fatto che le richieste troncate seguano immediatamente la richiesta non tronca probabilmente suggerisce qualcosa, ma non so cosa sia. Può essere un plugin che riproduce la richiesta o il NAT che replica la richiesta? Un proxy trasparente?