Vous consultez la documentation Apigee Edge.
Accédez à la
documentation**Apigee X**. info
Problème constaté
L'application cliente reçoit un code d'état HTTP 502 Bad Gateway avec le code d'erreur protocol.http.Response405WithoutAllowHeader en réponse aux appels d'API.
Message d'erreur
L'application cliente reçoit le code de réponse suivant :
HTTP/1.1 502 Bad Gateway
Vous pouvez également observer le message d'erreur suivant :
{
"fault":{
"faultstring":"Received 405 Response without Allow Header",
"detail":{
"errorcode":"protocol.http.Response405WithoutAllowHeader"
}
}
}Causes possibles
Cette erreur se produit si le serveur backend répond avec 405 Method Not Allowed status
code sans l'Allow header.
Conformément à la spécification
RFC 7231, section 6.5.5 : 405 Method Not Allowed, il est attendu que le serveur d'origine
DOIT générer et envoyer un champ d'en-tête Allow dans une réponse 405 contenant une
liste des méthodes actuellement compatibles avec la ressource cible. Si ce n'est pas le cas, Apigee répond avec
502 Bad Gateway et le code d'erreur protocol.http.Response405WithoutAllowHeader.
| Cause | Description | Instructions de dépannage applicables |
|---|---|---|
| Réponse 405 sans en-tête "Allow" du serveur backend | Le serveur backend qui traite la requête d'API répond avec le code d'état 405 sans l'en-tête Allow. |
Utilisateurs d'Edge Public Cloud et Private Cloud |
Étapes de diagnostic courantes
Utilisez l'un des outils/techniques suivants pour diagnostiquer cette erreur :
Surveillance des API
Pour diagnostiquer l'erreur à l'aide de la surveillance des API :
- Connectez-vous à l'interface utilisateur Edge en tant qu'utilisateur disposant d'un rôle approprié.
Basculez vers l'organisation dans laquelle vous souhaitez examiner le problème.
- Accédez à la page Analyze > API Monitoring > Investigate (Analyser > Surveillance des API > Examiner).
- Sélectionnez la période spécifique au cours de laquelle vous avez observé les erreurs.
Tracez le code d'erreur par rapport à l'heure.
Sélectionnez une cellule contenant le code d'erreur
protocol.http.Response405WithoutAllowHeader, comme illustré ci-dessous :
Les informations sur le code d'erreur
protocol.http.Response405WithoutAllowHeaders'affichent comme suit :
Cliquez sur View logs (Afficher les journaux) et développez l'une des requêtes ayant échoué pour afficher plus d'informations.
- Dans la fenêtre Logs (Journaux), notez les informations suivantes :
- Code d'état :
502 - Source de l'erreur :
target - Code d'erreur :
protocol.http.Response405WithoutAllowHeader.
- Code d'état :
- Si la source de l'erreur est
targetet que le code d'erreur estprotocol.http.Response405WithoutAllowHeader, cela indique que le serveur backend a répondu avec le code d'état405 Method Not Allowedsans l' en-têteAllow.
Outil Trace
Pour diagnostiquer l'erreur à l'aide de l'outil Trace :
- Activez la
session de trace et
- attendez que l'erreur
502 Bad Gatewayse produise, ou - si vous pouvez reproduire le problème, effectuez l'appel d'API pour le reproduire -
502 Bad Gatewayerreur
- attendez que l'erreur
Assurez-vous que l'option Show all FlowInfos (Afficher toutes les FlowInfos) est activée :
- Sélectionnez l'une des requêtes ayant échoué et examinez la trace.
- Parcourez les différentes phases de la trace et identifiez l'endroit où l'échec s'est produit.
L'erreur se trouve généralement dans un flux après la phase Request sent to target server comme illustré ci-dessous :
Notez la valeur de l'erreur dans la trace.
L'exemple de trace ci-dessus indique l'erreur
Received 405 Response without Allow Header. Étant donné que l'erreur est générée par Apigee après l'envoi de la requête au serveur backend, cela indique que le serveur backend a envoyé le code d'état de réponse405sans l'en-têteAllow.- Accédez à la phase AX (Analytics Data Recorded) de la trace et cliquez dessus.
Faites défiler la page jusqu'à la section Error / Response Headers (En-têtes d'erreur/de réponse) du panneau Phase Details (Détails de la phase) et déterminez les valeurs de X-Apigee-fault-code et X-Apigee-fault-source , comme illustré ci-dessous :
- Les valeurs de X-Apigee-fault-code et X-Apigee-fault-source sont respectivement
protocol.http.Response405WithoutAllowHeaderettarget, ce qui indique que cette erreur est due au fait que le backend a envoyé le code d'état de réponse405sans l'en-têteAllow.En-têtes de réponse Valeur X-Apigee-fault-code protocol.http.Response405WithoutAllowHeaderX-Apigee-fault-source target
NGINX
Pour diagnostiquer l'erreur à l'aide des journaux d'accès NGINX :
- Si vous êtes un utilisateur de Private Cloud, vous pouvez utiliser les journaux d'accès NGINX pour déterminer les
informations clés sur les erreurs HTTP
502. Vérifiez les journaux d'accès NGINX :
/opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log
Où : ORG, ORG et PORT# sont remplacés par des valeurs réelles.
- Recherchez les éventuelles erreurs
502avec le code d’erreurprotocol.http.Response405WithoutAllowHeaderpendant une durée spécifique (si le problème s’est produit dans le passé) ou si des requêtes échouent toujours avec502. Si vous trouvez des
502erreurs dont le X-Apigee-fault-code correspond à la valeurprotocol.http.Response405WithoutAllowHeader, déterminez la valeur de X-Apigee-fault-source.Exemple d'erreur 502 dans le journal d'accès NGINX :
L'entrée d'exemple ci-dessus du journal d'accès NGINX présente les valeurs suivantes pour X-Apigee- fault-code et X-Apigee-fault-source:
En-têtes de réponse Valeur X-Apigee-fault-code protocol.http.Response405WithoutAllowHeaderX-Apigee-fault-source target
Cause : Réponse 405 sans en-tête "Allow" du serveur backend
Diagnostic
- Déterminez le code d'erreur et la source de l'erreur pour
502 Bad Gatewayà l'aide de la surveillance des API, de l'outil Trace ou des journaux d'accès NGINX, comme expliqué dans Étapes de diagnostic courantes. - Si le code d'erreur est
protocol.http.Response405WithoutAllowHeaderet que la source de l'erreur a la valeurtarget, cela indique que le serveur backend a répondu avec un code d'état405sans l'en-têteAllow. Par conséquent, Apigee répond avec502 Bad Gatewayet le code d'erreurprotocol.http.Response405WithoutAllowHeader.
Solution
Utilisez l'une des méthodes suivantes pour résoudre le problème :
Serveur backend
Option 1 : Corrigez le serveur backend pour qu'il envoie le code d'état 405 avec l'en-tête "Allow" :
Assurez-vous que le serveur backend respecte toujours la spécification RFC 7231, section 6.5.5 : 405 Method Not Allowed et envoie le code d'état
405en incluant la liste des méthodes autorisées dans un en-têteAllow, comme illustré ci-dessous :Allow: HTTP_METHODS
- Par exemple, si votre serveur backend autorise les méthodes
GET,POSTetHEAD, vous devez vous assurer que l'en-têteAllowles contient comme suit :Allow: GET, POST, HEAD
Gestion des erreurs
Option 2 : Utilisez la gestion des erreurs pour envoyer le code d'état 405 avec l'en-tête "Allow" à partir de votre proxy d'API :
Si le serveur backend renvoie le code d'état 405 sans l'en-tête Allow
, vous pouvez utiliser la gestion des erreurs pour répondre avec le code d'état 405 et l'en-tête
Allow à partir de votre proxy d'API, comme suit :
Créez une règle telle que la règle AssignMessage ou la règle RaiseFault et définissez le code d'état sur
405avec l'en-têteAllowet un message personnalisé.Exemple de règle AssignMessage pour envoyer 405 avec l'en-tête "Allow" :
<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-405WithAllowHeader"> <DisplayName>AM-405WithAllowHeader</DisplayName> <Set> <Payload contentType="application/json">{"Specified method is not allowed. Please use one of the methods mentioned in the Allow header."}</Payload> <StatusCode>405</StatusCode> <ReasonPhrase>Method Not Allowed</ReasonPhrase> </Set> <Add> <Headers> <Header name="Allow">GET, POST, HEAD</Header> </Headers> </Add> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Créez un
FaultRuledans leTargetEndpoint, qui appelle la règle lors de la réception de l'erreur502avec le code d'erreurprotocol.http.Response405WithoutAllowHeader.Exemple de configuration TargetEndpoint montrant FaultRule :
<TargetEndpoint name="default"> ... <FaultRules> <FaultRule name="405WithoutAllowHeader"> <Step> <Name>AM-405WithAllowHeader</Name> </Step> <Condition>(fault.name = "Response405WithoutAllowHeader")</Condition> </FaultRule> </FaultRules>- Enregistrez ces modifications dans une nouvelle révision de votre proxy d'API et déployez la révision.
- Effectuez les appels d'API et vérifiez que vous obtenez le
405code d'état avec l'Allowen-tête.
Configurer la propriété
Option 3 : Configurez la propriété dans le processeur de messages pour empêcher Apigee Edge de renvoyer une erreur 502
- Si vous êtes un utilisateur de Private Cloud, vous pouvez définir la propriété
HTTP.ignore.allow_header.for.405surtruepour empêcher Apigee Edge de générer une erreur502, même si le serveur backend répond avec le code d'état405sans l'en-têteAllow, à l'aide du guide pratique : Configurer l'en-tête "Allow" à ignorer pour la propriété 405 dans les processeurs de messages. - Si vous êtes un utilisateur de Public Cloud, veuillez contacter l'assistance Apigee Edge
Spécification
Apigee attend la réponse 405 Method Not Allowed du serveur backend avec
l'en-tête Allow, conformément aux spécifications suivantes :
| Spécification | |
|---|---|
| RFC 7231, section 6.5.5: 405 Method Not Allowed (en anglais) | |
| RFC 7231, section 7.4.1: Allow (en anglais) |
Points importants à retenir
La solution recommandée consiste à corriger le serveur backend pour qu'il envoie le 405 code d'état
avec l'en-tête Allow et qu'il respecte la spécification
RFC 7231, section 6.5.5 : 405 Method Not Allowed.
Si vous avez encore besoin d'aide de la part de l'assistance Apigee, consultez la section Vous devez collecter des informations de diagnostic.
Vous devez collecter des informations de diagnostic
Si le problème persiste, même après avoir suivi les instructions ci-dessus, rassemblez les informations de diagnostic suivantes , puis contactez l'assistance Apigee Edge.
Si vous êtes un utilisateur de Public Cloud, fournissez les informations suivantes :
- Nom de l'organisation
- Nom de l'environnement
- Nom du proxy d'API
- Commande
curlcomplète utilisée pour reproduire l'502 Bad Gatewayavec le code d'erreurprotocol.http.Response405WithoutAllowHeader - Fichier de trace pour les requêtes d'API
Si vous êtes un utilisateur de Private Cloud, fournissez les informations suivantes :
- Message d'erreur complet observé pour les requêtes ayant échoué
- Nom de l'environnement
- Bundle de proxy d'API
- Fichier de trace pour les requêtes d'API
Journaux d'accès NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log
Où : ORG, ORG et PORT# sont remplacés par des valeurs réelles.
- Journaux système du processeur de messages
/opt/apigee/var/log/edge-message-processor/logs/system.log