Error interno del servidor - BadPath

Estás viendo la documentación de Apigee Edge.
Ve a la Documentación de Apigee X.
información

Síntoma

La aplicación cliente obtiene un código de estado HTTP de 500 Internal Server Error con el código de error protocol.http.BadPath como respuesta a las llamadas a la API.

Mensaje de error

La aplicación cliente obtiene el siguiente código de respuesta:

HTTP/1.1 500 Internal Server Error

Además, puedes observar el siguiente mensaje de error:

{
   "fault":{
      "faultstring":"Invalid request path",
      "detail":{
         "errorcode":"protocol.http.BadPath"
      }
   }
}

Causas posibles

Este error ocurre si la URL de solicitud del servidor de backend, representada por la variable de flujo target.url, contiene una path que comienza con un signo de interrogación (?) en su lugar de una barra diagonal (/), que es no válida.

Según las especificaciones Sección 3 del RFC 3986: Componentes de la sintaxis y RFC 3986, sección 3.3: Ruta de acceso:

  1. La sintaxis del URI tiene los siguientes componentes:

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. El componente path es obligatorio y DEBE comenzar con y siempre tendrán una barra diagonal (/).

Por lo tanto, si la URL de solicitud del servidor de backend tiene un componente path que se inicia con un signo de interrogación (?) en lugar de una barra diagonal (/) y, luego, Apigee Edge responde con 500 Internal Server Error y código de error. protocol.http.BadPath

Por ejemplo, si target.url tiene el valor https://www.mocktarget.apigee.net?json, este error se produce como Se determinó que path es no válido,ya que comienza con un signo de interrogación (?) en lugar de una barra diagonal (/).

Causa Descripción Instrucciones de solución de problemas aplicables para
La URL del servidor de backend (target.url) tiene una ruta no válida El componente de ruta de acceso en la URL del servidor de backend representado por la variable de flujo target.url comienza con un signo de interrogación (?) en lugar de una palabra hacia delante. o barra diagonal (/). Usuarios perimetrales de nubes públicas y privadas

Pasos comunes de diagnóstico

Usa una de las siguientes herramientas o técnicas para diagnosticar este error:

Supervisión de API

Procedimiento 1: Usa la supervisión de API

Para diagnosticar el error con la supervisión de API, haz lo siguiente:

  1. Accede a la IU de Apigee Edge como usuario con un el puesto adecuado.
  2. Cambia a la organización en la que quieres investigar el problema.

  3. Navega a Analyze > Supervisión de API > Investigar.
  4. Selecciona el período específico en el que observaste los errores.
  5. Traza Código de error en Tiempo.

  6. Selecciona una celda que tenga el código de falla protocol.http.BadPath como se muestra a continuación:

  7. La información sobre el código de falla protocol.http.BadPath se muestra como como se muestra a continuación:

  8. Haz clic en Ver registros y expande la fila de la solicitud con errores.

  9. En la ventana Registros, observa los siguientes detalles:
    • Código de estado: 500
    • Fuente del error: target
    • Código de error: protocol.http.BadPath
  10. Si la Fault Source es target y el Fault Code es protocol.http.BadPath, eso indica que la URL del servidor backend tiene un ruta de acceso no válida.

Trace

Procedimiento 2: Usa la herramienta Trace

Para diagnosticar el error con la herramienta Trace, sigue estos pasos:

  1. Habilita la sesión de seguimiento y haz lo siguiente:
    • Espera a que se produzca el error 500 Internal Server Error.
    • Si puedes reproducir el problema, realiza la llamada a la API para hacerlo. 500 Internal Server Error
  2. Asegúrate de que Show all FlowInfos esté habilitado:

  3. Selecciona una de las solicitudes fallidas y examina el seguimiento.
  4. Navega por las diferentes fases del seguimiento y localiza dónde ocurrió la falla.
  5. Por lo general, encontrarás el error en un flujo después de Target Request Flow Started (Flujo de solicitud objetivo iniciado). fase, como se muestra a continuación:

  6. Toma nota del valor del error del seguimiento:

    error: Ruta de solicitud no válida

    Dado que Apigee Edge presenta el error después de Target Request Flow Started, indica que la URL del servidor de backend tiene una ruta de acceso no válida. De esta forma, más probable es que suceda si la variable de flujo target.url (que representa la URL de backend) en Apigee Edge se haya actualizado con una ruta de acceso no válida una de las políticas en el flujo de solicitud de destino.

  7. Examina la sección Variables leídas y asignadas en cada uno de los flujos hacia atrás. del flujo de errores hacia la fase de Flujo de solicitud de destino iniciado.
  8. Determina la política, dónde estaba la variable de flujo target.url actualizado:

    Seguimiento de muestra que muestra que la política de JavaScript actualizó la variable de flujo target.url:

    En el seguimiento de ejemplo que se muestra arriba, anota el valor de la variable de flujo target.url se actualiza en una política de JavaScript llamada JS- SetTargetURL de la siguiente manera: target.url : https://mocktarget.apigee.net?json

  9. Ten en cuenta que el valor en target.url tiene los siguientes componentes:
    • esquema: https
    • autoridad: mocktarget.apigee.net
    • ruta de acceso: ?json
  10. Dado que el componente path comienza con un signo de interrogación (?) en lugar de una barra diagonal (/), recibirás el error Invalid request path
  11. Navega a la fase AX (datos registrados de Analytics) en el seguimiento y haz clic en ella.
  12. Desplázate hacia abajo hasta la sección Detalles de la fase - Encabezados de error y determina el valores de X-Apigee-fault-code y X-Apigee-fault-source como se muestra a continuación:

  13. Verás los valores X-Apigee-fault-code y X-Apigee-fault-source como protocol.http.BadPath y target , respectivamente, Este indica que este error se debe a que la URL del servidor de backend tiene una ruta no válida.

    Encabezados de respuesta Valor
    X-Apigee-fault-code protocol.http.BadPath
    X-Apigee-fault-source target

NGINX

Procedimiento 3: Usa registros de acceso de NGINX

Para diagnosticar el error con los registros de acceso de NGINX, haz lo siguiente:

  1. Si eres un usuario de la nube privada, puedes usar los registros de acceso de NGINX para determinar la información clave sobre 500 Internal Server Error HTTP.
  2. Verifica los registros de acceso de NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

  3. Realiza una búsqueda para ver si hay algún error 500 con el código de error protocol.http.BadPath durante un período específico (si el problema ocurrió en el anteriores) o si todavía hay solicitudes que fallan con 500.
  4. Si encuentras algún error 500 con la coincidencia X-Apigee-fault-code el valor de protocol.http.BadPath y, luego, determina el valor del argumento X- Fuente de errores de Apigee.

    Ejemplo de error 500 del registro de acceso de NGINX:

    La entrada de ejemplo anterior del registro de acceso de NGINX tiene los siguientes valores para X-Apigee- error-code y X-Apigee-fault-source:

    Encabezados Valor
    X-Apigee-fault-code protocol.http.BadPath
    X-Apigee-fault-source target

    Ten en cuenta que los valores de X-Apigee-fault-code y X-Apigee-fault-source son protocol.http.BadPath y target , respectivamente, que indican que este error se produce porque la URL del servidor de backend tiene una ruta de acceso no válida.

Causa: La URL del servidor de backend (target.url) tiene una ruta de acceso no válida

Diagnóstico

  1. Determina el código de errores y la fuente de errores de 500 Internal Server Error con la supervisión de API, la herramienta de seguimiento o los registros de acceso de NGINX como se explica en Pasos comunes del diagnóstico.
  2. Si el Código de error es protocol.http.BadPath y la Fuente del error tiene el valor target, esto indica que la URL del servidor backend tiene una URL no válida de la ruta de acceso.
  3. La variable de flujo target.url representa la URL del servidor de backend en Apigee. Edge. Este error suele ocurrir si intentas actualizar la URL del servidor de backend (target.url) de forma dinámica usando cualquiera de las políticas (dentro de proxy/flujo compartido) en el flujo de la solicitud de destino, de modo que tenga una ruta de acceso no válida.

  4. Determina si la variable de flujo target.url tiene un valor no válido path y la fuente de su valor mediante uno de los siguientes métodos:

    Trace

    Usa la herramienta Trace

    Si has capturado un registro para este error, sigue los pasos que se explican en Usar la herramienta Trace y

    1. Verifica si target.url tiene una ruta de acceso no válida, es decir, si comienza con un signo de interrogación (?) en lugar de una barra diagonal (/).
    2. Si es así, averigüe cuál es la política que modificó o actualizó el valor de target.url para que contenga una ruta de acceso no válida.

      Seguimiento de muestra que muestra que la política de JavaScript actualizó la variable de flujo target.url

    3. En el seguimiento de muestra anterior, observa que la política de JavaScript modificó o actualizó el valor de target.url para que contenga una ruta de acceso no válida.
    4. Ten en cuenta que target.url tiene los siguientes componentes:
      • esquema: https
      • autoridad: mocktarget.apigee.net
      • ruta de acceso: ?json

      La ruta comienza con un signo de interrogación (?) en lugar de un avance. (/), por lo tanto, no es válida.

    Registros

    Usa registros en tu servidor de registros

    1. Si no puedes rastrear este error (un problema intermitente), comprueba si registraste la información sobre el valor de la variable de flujo target.url, con políticas como MessageLogging o ServiceReferencia a tu servidor de registros.
    2. Si tienes los registros, revísalos
      1. Verifica si target.url tiene una ruta de acceso no válida.
      2. Ve si puedes determinar la información sobre qué política se modificó target.url para que contenga una ruta no válida

    proxy de API

    Revisa el proxy de API con errores

    Si no tienes registros de este error, revisa la API con errores proxy para determinar qué modificó o actualizó la variable de flujo target.url para que contenga una ruta de acceso no válida. Verifica lo siguiente:

    • La política en el proxy de API
    • Cualquier flujo compartido que se invoca desde el proxy
  5. Examina detenidamente la política específica (por ejemplo,AssignMessage o JavaScript) que modifica o actualiza la variable de flujo target.url y determina la causa del actualizando target.url para que tenga una ruta de acceso no válida.

    Estas son algunas políticas de ejemplo que actualizan la variable de flujo target.url contiene incorrectamente una ruta de acceso no válida que conduce a este error.

    Ejemplo 1

    Ejemplo 1: Actualización de la variable target.url de la política de JavaScript

    var url = "https://mocktarget.apigee.net?json"
    context.setVariable("target.url", url);
    

    En el ejemplo anterior, ten en cuenta que la variable de flujo target.url se actualiza. con el valor https://mocktarget.apigee.net?json contenido en otra variable url.

    Ten en cuenta que el valor de url tiene los siguientes componentes:

    • esquema: https
    • autoridad: mocktarget.apigee.net
    • ruta de acceso: ?json

    La ruta comienza con un signo de interrogación (?) en lugar de una barra diagonal. (/), que es no válido. Por lo tanto, Apigee Edge vuelve 500 Internal Server Error con el código de error protocol.http.BadPath.

    Ejemplo 2

    Ejemplo 2: Actualización de la variable target.url de la política de JavaScript según el valor del encabezado de la solicitud

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);
    

    En el ejemplo anterior, observa que la variable de flujo target.url se actualiza. mediante la concatenación del valor https://mocktarget.apigee.net contenido en un variable url y el valor de otra variable path, cuyo valor se recupera de request.header.Path.

    Si tienes acceso a la solicitud o el seguimiento reales, puedes verificar el valor real. pasado a request.header.Path.

    Solicitud de ejemplo que realiza el usuario

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: ?user"
    

    En este ejemplo, la ruta del encabezado no se envía como parte de la solicitud. Por lo tanto, el valor de la variable path en la política de JavaScript es null.

    Entonces:

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + "?user"
    • target.url = https://mocktarget.apigee.net?user

    Ten en cuenta que el valor de target.url tiene los siguientes componentes:

    • esquema: https
    • autoridad: mocktarget.apigee.net
    • ruta de acceso: ?user

    La ruta comienza con un signo de interrogación (?) en lugar de una barra diagonal. (/), que es no válido. Por lo tanto, Apigee Edge muestra 500 Internal Server Error con el código de error protocol.http.BadPath.

    Ejemplo 3

    Ejemplo 3: Actualización de la política target.url de la política deAssignMessage

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net?echo</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    Ten en cuenta que el valor de url tiene los siguientes componentes:

    • esquema: https
    • autoridad: mocktarget.apigee.net
    • ruta de acceso: ?echo

    En este ejemplo, la ruta comienza con un signo de interrogación (?). en lugar de una barra diagonal (/), que es no válida. Por lo tanto, Apigee Edge muestra 500 Internal Server Error con un código de error protocol.http.BadPath

Solución

Según la especificación de URL RFC 3986, sección 3: Componentes de sintaxis, es obligatorio el componente path y DEBE comenzar siempre con "/". Por lo tanto, sigue estos pasos para solucionar este problema:

  1. Asegúrate de que la URL del servidor de backend, representada por la variable de flujo target.url siempre tiene una ruta de acceso válida y siempre comienza con un barra diagonal (/).
      .
    1. En algunos casos, es posible que no tengas un nombre de recurso en la ruta, entonces asegúrate de que el la ruta tiene, al menos, una barra diagonal (/).
    2. Si usas otras variables para determinar el valor de la variable de flujo target.url y asegúrate de que las otras variables no tengan un ruta de acceso no válida.
    3. Si realizas alguna operación de cadena para determinar el valor de la variable de flujo. target.url y, luego, asegúrate de que el resultado de la cadena Las operaciones no tienen una ruta de acceso no válida.
  2. En las muestras que mencionamos anteriormente, puedes solucionar este problema de la siguiente manera:

    Ejemplo 1

    Ejemplo 1: Actualización de la variable target.url de la política de JavaScript

    Usa una barra diagonal (/) en lugar de un signo de interrogación (?) en la la variable url para solucionar este problema como se muestra a continuación:

    var url = "https://mocktarget.apigee.net/json"
    context.setVariable("target.url", url);
    

    Ejemplo 2

    Ejemplo 2: Actualización de la variable target.url de la política de JavaScript según el valor del encabezado de la solicitud

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);
    

    Asegúrate de pasar una ruta de acceso válida, por ejemplo: /user, como parte de la solicitud. encabezado Path para solucionar este problema como se muestra a continuación:

    Solicitud de muestra:

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /user"
    

    Ejemplo 3

    Ejemplo 3: Actualización de la variable target.url de la política deAssignMessage

    Agrega una ruta de acceso válida en el elemento <Value> de la políticaAssignMessage. Es decir, reemplaza el signo de interrogación (?) por a barra diagonal (/) en el elemento <Value> y Establécelo en https://mocktarget.apigee.net/echo para corregir el problema como se muestra a continuación:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net/echo</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    Especificación

    Apigee Edge espera que el path componente en la URL del servidor de backend DEBE comenzar siempre con una barra diagonal (/) de acuerdo con lo siguiente específicas:

    Especificación
    RFC 3986, sección 3: Componentes de sintaxis
    RFC 3986, sección 3.3: Ruta de acceso

    Si aún necesitas asistencia del equipo de asistencia de Apigee, ve a Debes recopilar y la información de diagnóstico.

    Se debe recopilar información de diagnóstico

    Si el problema persiste, incluso después de seguir las instrucciones anteriores, reúne la siguiente información de diagnóstico y, luego, comunícate con el equipo de asistencia de Apigee Edge:

    Si eres usuario de la nube pública, proporciona la siguiente información:

    • Nombre de la organización
    • Nombre del entorno
    • Nombre del proxy de API
    • Completa el comando curl que se usa para reproducir 500 Internal Server Error con el código de error protocol.http.BadPath
    • Archivo de seguimiento de las solicitudes a la API

    Si eres un usuario de la Nube privada, proporciona la siguiente información:

    • Mensaje de error completo observado para las solicitudes fallidas
    • Nombre del entorno
    • Paquete de proxy de API
    • Archivo de seguimiento de las solicitudes a la API
    • Registros de acceso de NGINX:

      /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

      Dónde: ORG, ENV y PORT# se reemplazan por valores reales.

    • Registros del sistema del procesador de mensajes /opt/apigee/var/log/edge-message- processor/logs/system.log

    Referencias

    Variables de flujo: objetivo