2010-10-08 13 views
9

'sto creando un po' di magia webby e sto usando Apache per frontare il nostro server tomcat, inoltrando richieste a tomcat sulla porta 8080. Ho un problema usando Apache e mod_proxy per inoltrare richieste. Sembra che il client (un'applicazione web) invii un HTTP 100-continue a cui Apache risponde con una 417 Expectation Failed.Apache e mod_proxy non gestiscono HTTP 100-continua dal client HTTP 417

Quando estrapro Apache dall'immagine e invio richieste direttamente a tomcat sulla porta 8080, la richiesta viene eseguita correttamente e al client viene inviato un 200 OK.

La mia configurazione di Apache si presenta come:

ServerName abcproxy DocumentRoot/apps/apache-content/default

AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript text/xml 

BrowserMatch ^Mozilla/4 gzip-only-text/html 
BrowserMatch ^Mozilla/4\.0[678] no-gzip 
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html 

ExpiresActive on 
ExpiresDefault "access 0 seconds" 

ProxyPass/http://127.0.0.1:8080/ 
ProxyPassReverse/http://127.0.0.1:8080/ 

     ProxyPreserveHost On 

CustomLog /apps/ocp-logs/apache/abcproxy.log combined 

Chiunque vedere dove sto andando male?

risposta

24

Apache ha un problema noto e non risolto con le intestazioni Expect, vedere bug 46709 e bug 47087.

Il problema è che alcuni client impostano l'intestazione Expect e inviano solo le intestazioni di richiesta prima di un PUT o POST di dati. Ciò consente al server di rispondere con errori/reindirizzamenti/violazioni della sicurezza prima che il client invii il corpo della richiesta (dati PUT o POST). Questo è un obiettivo lodevole, ma a quanto pare il client non aspetta fino a quando non ottiene una risposta e spinge semplicemente fuori il corpo della richiesta, il che risulta nell'errore 417.

Se si ha il controllo su un client .NET, è possibile utilizzare ServicePointManager.Expect100Continue Property impostato su false per ignorare questo comportamento.

Se si ha solo il controllo sul server, sembra che sia possibile forzare l'HTTP 1.0 per quei client (magari in base alla stringa dell'agent user) o forzare l'annullamento dell'intestazione Expect usando mod_header nella richiesta anticipata.

Per rimuovere l'intestazione aspettare dalla richiesta di inizio utilizzando mod_headers Utilizzare questa direttiva config:

<IfModule mod_headers.c> 
RequestHeader unset Expect early 
</IfModule> 

Questo funziona perché il client non è in realtà attesa per la risposta "100 Continua" e di agire come se l'intestazione Expect non erano fissati.

+0

nice share, grazie – no9

+0

Esattamente al punto, e grande che hai citato per client .NET questo potrebbe essere risolto impostando la proprietà Expect100Continue su false. Comunque lo abbiamo aggiunto rimuovendo l'header Expect da Apache –

Problemi correlati