2010-10-08 7 views
9

'm budują magię webby i używam Apache'a, aby wyprzedzić nasz serwer tomcat, przesyłając żądania do tomcat na porcie 8080. Mam problem z wykorzystaniem Apache i mod_proxy do przekazania upraszanie. Wygląda na to, że klient (aplikacja internetowa) wysyła kontynuację HTTP 100, do której Apache odpowiada, oczekując 417 oczekiwania.Apache i mod_proxy nie obsługują HTTP 100-kontynuują od klienta HTTP 417

Kiedy wyjmuję Apache z obrazu i wysyłam żądania bezpośrednio do tomcat na porcie 8080, żądanie się powiedzie i klient otrzyma 200 OK.

My Apache config wygląda następująco:

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 

ktoś widział dokąd idę źle?

Odpowiedz

24

Apache ma znany i nierozwiązany problem z nagłówkami Expect, zobacz bug 46709 i bug 47087.

Problem polega na tym, że niektórzy klienci ustawiają nagłówek Expect i wysyłają tylko nagłówki żądań przed PUT lub POST danych. Umożliwia to serwerowi reagowanie z błędami/przekierowaniami/naruszeniami bezpieczeństwa przed wysłaniem przez klienta treści żądania (dane PUT lub POST). Jest to cel godny pochwały, ale najwyraźniej klient nie czeka, aż otrzyma odpowiedź i po prostu wypiera treść żądania, co powoduje błąd 417.

Jeśli masz kontrolę nad klientem .NET, możesz użyć ustawienia ServicePointManager.Expect100Continue Property na wartość false, aby zastąpić to zachowanie.

Jeśli masz tylko kontrolę nad serwerem, wygląda na to, że możesz wymusić HTTP 1.0 dla tych klientów (być może na podstawie ciągu agenta użytkownika) lub wymusić rozbrojenie nagłówka Expect za pomocą mod_header na początku żądania.

Aby usunąć nagłówek oczekiwać od wniosku wcześnie używając mod_headers wykorzystywać tę dyrektywę config:

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

To działa, ponieważ klient nie jest faktycznie czeka na odpowiedź „100 Kontynuuj” oraz działając jakby Expect nagłówka nie zostały ustawione.

+0

Przyjemny udział, thanx – no9

+0

Dokładnie na temat i wspaniale, o czym wspomniał klient .NET, można to rozwiązać, ustawiając właściwość Expect100Continue na wartość false. Jednak dodaliśmy go, usuwając nagłówek Expect z Apache –