2010-10-08 3 views
9

Je construis un peu de webby magic et j'utilise Apache pour faire face à notre serveur tomcat, en transférant les requêtes à tomcat sur le port 8080. J'ai un problème avec Apache et mod_proxy pour transférer demandes Il semble que le client (une application web) envoie un HTTP 100-continue auquel Apache répond avec un échec de 417.Apache et mod_proxy ne gèrent pas HTTP 100-continuer à partir du client HTTP 417

Lorsque je retire Apache de l'image et envoie des requêtes directement à Tomcat sur le port 8080, la requête aboutit et le client reçoit un 200 OK.

config Mon Apache ressemble:

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 

Tout le monde voir où je vais mal?

Répondre

24

Apache a un problème connu et non résolu avec les en-têtes Expect, voir bug 46709 et bug 47087.

Le problème est que certains clients définissent l'en-tête Expect et n'envoient que les en-têtes de demande avant un PUT ou un POST de données. Cela permet au serveur de répondre avec des erreurs/redirections/violations de sécurité avant que le client envoie le corps de la requête (données PUT ou POST). C'est un objectif louable, mais apparemment, le client n'attend pas d'avoir une réponse et expulse juste le corps de la requête, ce qui entraîne l'erreur 417.

Si vous contrôlez un client .NET, vous pouvez utiliser ServicePointManager.Expect100Continue Property défini sur false pour remplacer ce comportement. Si vous avez seulement le contrôle sur le serveur, il semble que vous pouvez forcer HTTP 1.0 pour ces clients (peut-être en fonction de la chaîne de l'agent utilisateur) ou forcer l'en-tête Expect en utilisant mod_header au début de la requête.

Pour enlever l'Attendez-vous à en-tête de la demande anticipée en utilisant mod_headers Cette directive de configuration:

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

Cela fonctionne parce que le client attend pas vraiment pour la réponse « 100 Continuer » et agir comme si l'en-tête Attendez-vous n'ont pas été définis.

+0

bon partage, thanx – no9

+0

Exactement au point, et génial que vous avez mentionné pour le client .NET cela pourrait être résolu en définissant la propriété Expect100Continue à false. Cependant, nous l'avons ajouté en supprimant l'en-tête Expect d'Apache –

Questions connexes