Risoluzione degli errori HTTP 400 in IIS

di Mike Laing

Strumenti usati in questo strumento di risoluzione dei problemi:

  • Network Monitor
  • Registrazione degli errori HTTP

Questo materiale viene fornito solo a scopo informativo. Microsoft non riconosce alcuna garanzia, espressa o implicita.

Panoramica

Dopo l'invio di una richiesta HTTP a un server IIS, un client HTTP (ad esempio Internet Explorer) può visualizzare il tipo di messaggio di errore seguente:


HTTP 400Impossibile trovare la pagina Web.

Cause più probabili:

  • L'indirizzo non è stato digitato in modo corretto.
  • Se si fa clic su un collegamento, potrebbe non essere aggiornato.

Cosa è possibile provare:

  • Digitare nuovamente l'indirizzo.
  • Torna alla pagina precedente
  • Passare a Bing e cercare le informazioni desiderate.

Se il client HTTP è Internet Explorer e l'opzione Mostra messaggi di errore HTTP descrittivi è disattivata, l'errore potrebbe essere simile al seguente:

Bad Request

In questi scenari, IIS ha rifiutato la richiesta HTTP del client perché la richiesta non soddisfa le regole di analisi HTTP del server o ha superato i limiti di tempo oppure ha superato alcune altre regole a cui IIS o HTTP.sys richiedono l'adesione delle richieste in ingresso. IIS invia di nuovo lo stato HTTP 400 - Richiesta non valida al client e quindi termina la connessione TCP.

Metodi di risoluzione dei problemi

Quando si risolve una condizione HTTP 400, è importante ricordare che il problema sottostante è che il client ha inviato una richiesta a IIS che interrompe una o più regole che HTTP.sys sta applicando. Tenendo presente questo aspetto, si vuole vedere esattamente ciò che il client invia a IIS; a tale scopo, acquisire una traccia di rete del client che invia la richiesta non valida. È possibile analizzare la traccia per visualizzare i dati non elaborati inviati dal client a IIS e visualizzare i dati di risposta non elaborati inviati da IIS al client. È anche possibile usare uno strumento di sniffer HTTP denominato Fiddler; questo è un ottimo strumento perché consente di visualizzare le intestazioni HTTP anche se il client e il server comunicano tramite SSL.

L'elemento di dati successivo che si vuole usare è il C:\Windows\System32\LogFiles\HTTPERR\httperr.log file . A partire da IIS 6.0, il componente HTTP.sys gestisce le richieste HTTP in ingresso prima che vengano passate a IIS ed è il componente responsabile del blocco delle richieste che non soddisfano i requisiti di IIS. Quando HTTP.sys blocca la richiesta, registra le informazioni nel file httperr.log relativo alla richiesta non valida e al motivo per cui è stato bloccato.

NOTA: per altre informazioni sulla registrazione degli errori dell'API HTTP fornita da HTTP.sys, vedere l'articolo seguente:

È tecnicamente possibile, anche se non molto probabile, che un client riceverà una risposta HTTP 400 che non dispone di una voce di log associata in httperr.log. Ciò può verificarsi se un filtro ISAPI o un'estensione o un modulo HTTP in IIS imposta lo stato 400, nel qual caso è possibile esaminare il log IIS per ulteriori informazioni. Può verificarsi anche se un'entità tra il client e il server, ad esempio un server proxy o un altro dispositivo di rete, intercetta una risposta da IIS ed esegue l'override con lo stato 400 e/o l'errore "Richiesta non valida".

Scenario di esempio

Di seguito è riportato un esempio di scenario HTTP 400, in cui un client invia una richiesta non valida a IIS e il server invia un messaggio HTTP 400 - Richiesta non valida.

Quando il client invia la richiesta, l'errore del browser restituito è simile al seguente:

Richiesta non valida (campo intestazione troppo lungo)

L'acquisizione di una traccia di rete della richiesta e della risposta viene visualizzata la richiesta/risposta non elaborata seguente:

RICHIESTA:

HTTP: GET Request from Client
HTTP: Request Method =GET
HTTP: Uniform Resource Identifier =/1234567890123456789012345678901234567890/time.asp
HTTP: Protocol Version =HTTP/1.1
HTTP: Accept-Language =en-us
HTTP: UA-cpu =x86
HTTP: Accept-Encoding =gzip, deflate
HTTP: Host =iisserver
HTTP: Connection =Keep-Alive
HTTP: Data: Number of data bytes remaining = 14 (0x000E)

RISPOSTA:

HTTP: Response to Client; HTTP/1.1; Status Code = 400 - Bad Request
HTTP: Protocol Version =HTTP/1.1
HTTP: Status Code = Bad Request
HTTP: Reason =Bad Request
HTTP: Content-Type =text/html
HTTP: Date =Wed, 14 Nov 2012 20:36:36 GMT
HTTP: Connection =close
HTTP: Content-Length =44
HTTP: Data: Number of data bytes remaining = 63 (0x003F)

Si noterà che le intestazioni di risposta non indicano quanto il messaggio di errore nel browser. Tuttavia, se si esaminano i dati non elaborati nel corpo della risposta, verranno visualizzati altri elementi:

00000030                                           48 54               HT
00000040 54 50 2F 31 2E 31 20 34 30 30 20 42 61 64 20 52 TP/1.1.400.Bad.R
00000050 65 71 75 65 73 74 0D 0A 43 6F 6E 74 65 6E 74 2D equest..Content-
00000060 54 79 70 65 3A 20 74 65 78 74 2F 68 74 6D 6C 0D Type:.text/html.
00000070 0A 44 61 74 65 3A 20 57 65 64 2C 20 32 38 20 4A .Date:.Wed,.28.J
00000080 61 6E 20 32 30 30 39 20 32 30 3A 33 36 3A 33 36 an.2009.20:36:36
00000090 20 47 4D 54 0D 0A 43 6F 6E 6E 65 63 74 69 6F 6E .GMT..Connection
000000A0 3A 20 63 6C 6F 73 65 0D 0A 43 6F 6E 74 65 6E 74 :.close..Content
000000B0 2D 4C 65 6E 67 74 68 3A 20 34 34 0D 0A 0D 0A 3C -Length:.44....<
000000C0 68 31 3E 42 61 64 20 52 65 71 75 65 73 74 20 28 h1>Bad.Request.(
000000D0 48 65 61 64 65 72 20 46 69 65 6C 64 20 54 6F 6F Header.Field.Too
000000E0 20 4C 6F 6E 67 29 3C 2F 68 31 3E 01 02 03 04 05 .Long).....
000000F0 05 06 0E 94 63 D6 68 37 1B 8C 16 FE 3F D5       ....c.h7....?.

È possibile notare che il testo del messaggio di errore visualizzato nel browser è anche visualizzabile nei dati di risposta non elaborati nella traccia di rete.

Il passaggio successivo consiste nell'esaminare il file httperr.log nella C:\Windows\System32\LogFiles\HTTPERR directory per la voce che corrisponde alla richiesta non valida:

#Software: Microsoft HTTP API 1.0
#Version: 1.0
#Date: 2012-11-14 20:35:02
#Fields: date time cs-version cs-method cs-uri sc-status s-reason 
2012-11-14 20:36:36 HTTP/1.1 GET /1234567890/time.asp 400 FieldLength

In questo scenario, il campo Motivo nel file httperr.log fornisce le informazioni esatte necessarie per diagnosticare il problema. Si noterà qui che HTTP.sys fieldLength registrato come frase motivo per l'errore di questa richiesta. Dopo aver appreso la frase motivo, è possibile usare l'articolo Registrazione errori nell'API HTTP menzionato in precedenza per ottenere la relativa descrizione:

FieldLength: A field length limit was exceeded.

A questo punto si sa dal messaggio di errore del browser e dalla registrazione degli errori dell'API HTTP che la richiesta conteneva dati in una delle intestazioni HTTP che superano i limiti di lunghezza consentiti. Ai fini di questo esempio, l'intestazione HTTP: Uniform Resource Identifier è intenzionalmente lunga: /1234567890123456789012345678901234567890/time.asp.

La fase finale della risoluzione dei problemi di questo esempio consiste nell'usare l'articolo seguente per visualizzare le chiavi del Registro di sistema HTTP.sys e le impostazioni predefinite per IIS:

Poiché si conosce la frase motivo e l'errore suggerisce una lunghezza del campo di intestazione che supera i limiti, è possibile restringere la ricerca in KB820129 come tale. Il primo candidato è:

MaxFieldLength: imposta un limite superiore per ogni intestazione. Vedere MaxRequestBytes. Questo limite si traduce in circa 32.000 caratteri per un URL.

Per riprodurre questo errore per questo esempio, la chiave del Registro di sistema MaxFieldLength è stata impostata con il valore 2. Poiché l'URL richiesto ha un campo di intestazione HTTP: Uniform Resource Identifier con più di 2 caratteri, la richiesta è stata bloccata con la frase motivo FieldLength.

Un altro scenario HTTP 400 comune è quello in cui l'utente che effettua la richiesta HTTP è membro di un numero elevato di gruppi di Active Directory e il sito Web è configurato per l'autenticazione Kerberos dell'utente. In questo caso, all'utente verrà visualizzato un messaggio di errore simile al seguente:

Richiesta non valida (intestazione richiesta troppo lunga)

In questo scenario, il token di autenticazione incluso nell'ambito della richiesta HTTP del client è troppo grande e supera i limiti di dimensioni che http.sys sta applicando. Questo problema viene descritto in dettaglio, insieme alla soluzione, nell'articolo della Knowledge Base seguente:

Risorse aggiuntive