Pourquoi Apache + Rails crache-t-il deux en-têtes d'état pour le code 500?
-
03-07-2019 - |
Question
J'ai une application rails qui fonctionne bien, sauf pour une chose.
Lorsque je demande quelque chose qui n'existe pas (c'est-à-dire / not_a_controller_or_file.txt) et rails lève un & "Aucune route ne correspond à ... &"; exception, la réponse est la suivante (ligne blanche intentionnelle):
HTTP/1.1 200 OK
Date: Thu, 02 Oct 2008 10:28:02 GMT
Content-Type: text/html
Content-Length: 122
Vary: Accept-Encoding
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Status: 500 Internal Server Error
Content-Type: text/html
<html><body><h1>500 Internal Server Error</h1></body></html>
J'ai le plugin ExceptionLogger dans / vendor, bien que cela ne semble pas être le problème. Je n'ai pas ajouté de traitement d'erreur au-delà du fichier personnalisé 500.html en public (bien que la réponse ne contienne pas ce code HTML) et je ne sais pas du tout d'où provient ce morceau de HTML.
Quelque chose ajoute quelque part quelque part le code de statut HTTP / 1.1 200 trop tôt ou le Statut: 500 trop tard. Je suppose que c'est Apache parce que j'ai l'en-tête HTTP / 1.1 500 approprié (en haut) lorsque j'utilise Webrick.
Ma pile de production est la suivante: Apache 2 Bâtard (5 instances) RubyOnRails 2.1.1 (se produit dans les versions 1.2 et 2.1.1)
J'ai oublié de mentionner, l'erreur est provoquée par un & "aucune route ne correspond à ... &"; exception
La solution
Ceci est un fil de discussion assez ancien, mais j'ai trouvé une excellente ressource qui comprend une description détaillée du problème et de sa solution. Apparemment, ce bug affecte Rails & Lt; 2.3 lorsqu'il est utilisé avec Mongrel.
- L'article qui m'a aidé à comprendre le problème & amp; écrire mon propre patch.
- un ticket de bogue officiel de Rails comprenant un correctif pour Rails 2.2.2.
Autres conseils
Ce fichier HTML provient de Rails. Il rencontre une sorte d'erreur (probablement une exception ou une autre erreur irrécupérable).
Si la ligne blanche entre l'en-tête Status: et les en-têtes réels est présente, et pas seulement une faute de frappe, cela contribuerait grandement à expliquer pourquoi Apache a signalé un message 200 OK.
L’en-tête Status indique comment Rails, PHP ou tout ce qui indique à Apache & "; Une erreur s’est produite. Veuillez renvoyer ce code au lieu de 200 OK. &"; Le fait qu'il y ait une ligne vide signifie qu'il se passe quelque chose de plus et que Ruby affiche une ligne vierge avant l'erreur, quelle qu'en soit la raison. Peut-être que c'est la sortie précédente de votre script. En résumé, la ligne blanche supplémentaire signifie qu'Apache pense & "Oh, ligne blanche, pas d'en-têtes supplémentaires, tout est contenu maintenant. &" ;, ce qui serait cohérent avec le contenu. -En-tête de longueur que vous avez fourni.
Je suppose que la raison pour laquelle il existe une ligne vierge correspondrait à la sortie du script précédent, peut-être à la fin d'une page de script complète. Pour ce qui est de la cause de l’erreur 500, il n’ya pas assez d’informations ici pour vous le dire. Peut-être une erreur d’entrée / sortie de fichier.
Modifier: Etant donné les informations supplémentaires fournies par Dave sur les composants internes, je dirais que c'est en réalité un problème lié à la procuration en coulisse ... Je ne saurais vous dire. exactement quoi cependant, au-delà de ce qui a déjà été dit.
Cela vient des rails eux-mêmes.
http://github.com /rails/rails/tree/master/actionpack/lib/action_controller/dispatcher.rb#L60
Le répartiteur renvoie une page d'erreur avec le code d'état 200 (succès).