500 Внутренняя ошибка сервера – EmptyPath

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

Symptom

Клиентское приложение получает код статуса HTTP 500 Internal Server Error с кодом ошибки protocol.http.EmptyPath в качестве ответа на вызовы API.

Сообщение об ошибке

Клиентское приложение получает следующий код ответа:

HTTP/1.1 500 Internal Server Error

Кроме того, может появиться следующее сообщение об ошибке:

{
   "fault":{
      "faultstring":"Request path cannot be empty",
      "detail":{
         "errorcode":"protocol.http.EmptyPath"
      }
   }
}

Возможные причины

Эта ошибка возникает, если URL запроса внутреннего сервера, представленный переменной потока target.url, содержит пустой путь.

Согласно спецификациям RFC 3986, раздел 3: компоненты синтаксиса и RFC 3986, раздел 3.3: путь:

  1. Синтаксис URI состоит из следующих компонентов:

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. Компонент path является обязательным и всегда должен содержать косую черту (/), даже если в пути нет других символов.

Поэтому, если в URL запроса внутреннего сервера нет компонента path, то есть даже косой черты (/), Apigee Edge возвращает 500 Internal Server Error и код ошибки protocol.http.EmptyPath.

Например, если в столбце target.url указано значение https://www.mocktarget.apigee.net, то возникает ошибка, поскольку компонент path пуст или отсутствует.

Причина Описание Инструкции по устранению неполадок, применимые к
URL внутреннего сервера (target.url) содержит пустой путь URL внутреннего сервера, представленный переменной потока target.url, имеет пустой путь. Пользователи общедоступного и частного облака Edge

Распространенные этапы диагностики

Чтобы диагностировать эту ошибку, используйте один из следующих инструментов или методов:

Мониторинг API

Способ 1. Используйте API Monitoring

Чтобы диагностировать ошибку с помощью мониторинга API:

  1. Войдите в интерфейс Apigee Edge как пользователь с подходящей ролью.
  2. Перейдите к организации, в которой хотите изучить проблему.

  3. Перейдите на страницу Анализ > Мониторинг API > Исследование.
  4. Выберите период времени, в течение которого вы наблюдали ошибки.
  5. Постройте график Код ошибки по оси Y и Время по оси X.

  6. Выберите ячейку с кодом ошибки protocol.http.EmptyPath, как показано ниже.

  7. Информация о коде ошибки protocol.http.EmptyPath будет показана так, как описано ниже.

  8. Нажмите Посмотреть журналы , чтобы развернуть строку с неудачным запросом.

  9. В окне Журналы обратите внимание на следующие сведения:
    • Код статуса: 500.
    • Источник ошибки: target
    • Код ошибки: protocol.http.EmptyPath
  10. Если в поле Источник ошибки указано значение target, а в поле Код ошибки – protocol.http.EmptyPath, это означает, что URL внутреннего сервера содержит пустой путь.

Трассировка

Процедура 2. Использование инструмента трассировки

Чтобы диагностировать ошибку с помощью инструмента трассировки, выполните следующие действия:

  1. Включите трассировку сеанса и выберите один из следующих вариантов:
    • Дождитесь ошибки 500 Internal Server Error или
    • Если проблему можно воспроизвести, сделайте вызов API, чтобы воспроизвести ее. 500 Internal Server Error
  2. Убедитесь, что включен параметр Показывать все FlowInfo:

  3. Выберите один из неудачных запросов и изучите трассировку.
  4. Перемещайтесь по разным этапам трассировки и находите, где произошла ошибка.
  5. Обычно ошибка возникает на этапе после Target Request Flow Started, как показано ниже.

  6. Запишите значение ошибки из трассировки.

    error: Request path cannot be empty (ошибка: путь запроса не может быть пустым)

    Поскольку ошибка возникает в Apigee Edge после этапа Target Request Flow Started, это означает, что path в URL внутреннего сервера пуст. Скорее всего, это происходит, если переменная потока target.url (представляющая URL для внутреннего сервера) была обновлена пустым путем с помощью одного из правил в потоке запроса.

  7. Изучите раздел Variables Read and Assigned (Переменные, которые были прочитаны и которым были присвоены значения) в каждом из потоков в обратном порядке, начиная с точки ошибки и двигаясь к этапу Target Request Flow Started (Запущен поток целевого запроса).
  8. Определите правило, в котором обновляется переменная потока target.url .

    Пример трассировки, показывающий, что политика JavaScript обновила переменную потока target.url:

    В приведенном выше примере трассировки обратите внимание на то, что значение переменной потока target.url обновляется в правиле JavaScript с названием SetTargetURL следующим образом:

    target.url : https://mocktarget.apigee.net
  9. Обратите внимание, что target.url состоит из следующих компонентов:
    • scheme: https://mocktarget.apigee.net
    • path: пустое значение
  10. Поэтому вы получаете ошибку Request path cannot be empty.
  11. Перейдите к фазе AX (запись данных аналитики) в трассировке и нажмите на нее.
  12. Прокрутите страницу вниз до раздела Сведения об этапе – Заголовки ошибок и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:

  13. Вы увидите значения X-Apigee-fault-code и X-Apigee-fault-source как protocol.http.EmptyPath и target соответственно. Это означает, что ошибка возникла из-за того, что URL внутреннего сервера имеет пустой путь.
    Заголовки ответов Значение
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

nginx

Процедура 3. Использование журналов доступа NGINX

Чтобы диагностировать ошибку с помощью журналов доступа NGINX:

  1. Если вы используете частное облако, то можете использовать журналы доступа NGINX, чтобы определить ключевую информацию об HTTP 500 Internal Server Error.
  2. Проверьте журналы доступа NGINX:

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

  3. Выполните поиск, чтобы узнать, возникали ли ошибки 500 с кодом ошибки protocol.http.EmptyPath в течение определенного периода времени (если проблема возникла в прошлом) или есть ли запросы, которые по-прежнему завершаются с ошибкой 500.
  4. Если вы обнаружите ошибки 500, для которых X-Apigee-fault-code соответствует значению protocol.http.EmptyPath, определите значение X-Apigee-fault-source.

    Пример ошибки 500 из журнала доступа NGINX:

    В приведенной выше записи из журнала доступа NGINX для атрибутов X-Apigee-fault-code и X-Apigee-fault-source заданы следующие значения:

    заголовки; Значение
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

    Обратите внимание, что значения X-Apigee-fault-code и X-Apigee-fault-source – protocol.http.EmptyPath и target соответственно. Это означает, что ошибка возникла из-за того, что URL внутреннего сервера имеет путь.

Причина: у URL внутреннего сервера (target.url) пустой путь

диагностика;

  1. Определите код ошибки и источник ошибки для 500 Internal Server Error, используя API Monitoring, Trace Tool или журналы доступа NGINX, как описано в разделе Распространенные шаги диагностики.
  2. Если код ошибки – protocol.http.EmptyPath, а источник ошибки – target, это означает, что URL внутреннего сервера имеет путь.
  3. URL внутреннего сервера представлен переменной потока target.url в Apigee Edge. Эта ошибка обычно возникает, если вы пытаетесь обновить URL внутреннего сервера, то есть target.url динамически с помощью любого из правил (в рамках потока прокси-сервера или общего потока) в потоке запроса к целевому сервису, так что у него путь пуст.

  4. Чтобы определить, действительно ли переменная потока target.url имеет пустой путь и источник своего значения, выполните одно из следующих действий:

    Трассировка

    Как использовать инструмент трассировки

    Если вы записали трассировку этой ошибки, выполните действия, описанные в разделе Как использовать инструмент трассировки , и:

    1. Проверьте, есть ли у target.url пустой путь.
    2. Если да, выясните, какое правило изменило или обновило значение target.url, чтобы оно содержало пустой путь.

      Пример трассировки, показывающий, что правила JavaScript обновили переменную потока target.url:

    3. В приведенном выше примере трассировки видно, что правило JavaScript изменило или обновило значение target.url, добавив пустой путь.
    4. Обратите внимание, что target.url состоит из следующих компонентов:
      • scheme: https://mocktarget.apigee.net
      • path: пустое значение

    Журналы

    Как использовать журналы на сервере журналов

    1. Если трассировка для этой ошибки отсутствует (проблема возникает время от времени), проверьте, регистрируется ли информация о значении переменной потока target.url с помощью правил, таких как MessageLogging или ServiceCallout, на вашем сервере журналов.
    2. Если у вас есть журналы, проверьте их и:
      1. Проверьте, пуст ли путь к target.url, и
      2. Попробуйте определить, какие правила изменили target.url так, что он стал содержать пустой путь.

    прокси-сервер API

    Проверка неработающего прокси-сервера API

    Если у вас нет трассировки или журналов для этой ошибки, проверьте сбойный прокси API, чтобы определить, что изменило или обновило переменную потока target.url, в результате чего она стала содержать недопустимый путь. Проверьте следующее.

    • Правила в прокси-сервере API
    • Любые общие процессы, вызванные из прокси-сервера
  5. Внимательно изучите определенное правило (например, AssignMessage или JavaScript), которое изменяет или обновляет переменную потока target.url, и определите причину, по которой target.url обновляется до пустого пути.

    Ниже приведены примеры правил, которые неправильно обновляют переменную потока target.url, чтобы она содержала пустой путь, что приводит к этой ошибке.

    Пример 1

    Пример 1. Обновление переменной target.url в правилах JavaScript

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

    В приведенном выше примере обратите внимание, что переменная потока target.url обновляется со значением https://mocktarget.apigee.net, содержащимся в другой переменной url.

    Обратите внимание, что target.url состоит из следующих компонентов:

    • scheme: https://mocktarget.apigee.net
    • path: пустое значение

    Поскольку путь пуст, Apigee Edge возвращает 500 Internal Server Error с кодом ошибки protocol.http.EmptyPath.

    Пример 2

    Пример 2. Обновление правила JavaScript с помощью переменной target.url

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

    В приведенном выше примере обратите внимание, что переменная потока target.url обновляется путем объединения значения https://mocktarget.apigee.net, содержащегося в переменной url , и значения другой переменной path, которое извлекается из request.header.Path..

    Если у вас есть доступ к фактическому запросу или трассировке, вы можете проверить фактическое значение, переданное в request.header.Path.

    Пример запроса, сделанного пользователем:

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

    В этом примере путь к заголовку не отправляется как часть запроса. Таким образом, значение пути к переменной в правиле JavaScript – null.

    Допустим, к примеру, что вы отправили следующую строку:

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + null
    • target.url = https://mocktarget.apigee.netnull

    Обратите внимание, что target.url состоит из следующих компонентов:

    • scheme: https://mocktarget.apigee.netnull
    • path: пустое значение

    Пример 3

    Пример 3. Обновление переменной target.url с помощью другой переменной в правиле AssignMessage

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

    Обратите внимание, что target.url состоит из следующих компонентов:

    • scheme: https://mocktarget.apigee.net
    • path: пустое значение

    Во всех приведенных выше примерах путь в URL внутреннего сервера, то есть target.url, пуст, поэтому Apigee Edge возвращает 500 Internal Server Error с кодом ошибки protocol.http.EmptyPath.

Разрешение

Согласно спецификации RFC 3986, раздел 2: компоненты синтаксиса, компонент path является обязательным и всегда должен содержать косую черту (/), даже если в нем нет других символов path. Чтобы устранить проблему, выполните следующие действия:

  1. Убедитесь, что URL внутреннего сервера, представленный переменной потока target.url, всегда имеет непустой путь.
    1. Если в пути нет названия ресурса, убедитесь, что в нем есть хотя бы косая черта (/).
    2. Если вы используете другие переменные для определения значения переменной потока target.url, убедитесь, что у них не пустой путь.
    3. Если вы выполняете какие-либо строковые операции, чтобы определить значение переменной потока target.url, убедитесь, что в результате этих операций не получается пустой путь.
  2. В примерах, приведенных в разделе Диагностика, эту проблему можно устранить следующим образом:

    Пример 1

    Пример 1. Обновление переменной target.url в правилах JavaScript

    Чтобы устранить эту проблему, добавьте косую черту (/) к переменной url, как показано ниже:

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

    Пример 2

    Пример 2. Обновление переменной target.url в правилах JavaScript

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

    Чтобы устранить эту проблему, убедитесь, что вы передаете действительный путь, например /iloveapis, как часть заголовка запроса Path, как показано ниже:

    Пример запроса

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

    Пример 3

    Пример 3. Обновление переменной target.url с помощью другой переменной в правиле AssignMessage

    Добавьте действительный путь в элемент <Value> правила AssignMessage. Например, вы можете использовать /json в качестве пути для MockTarget API. То есть измените элемент <Value> на https://mocktarget.apigee.net/json, как показано ниже:

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

Спецификация

Apigee Edge ожидает, что URL внутреннего сервера не будет содержать пустой путь, как указано в следующих спецификациях:

Спецификация
RFC 3986, раздел 3: компоненты синтаксиса
RFC 3986, раздел 3.3: путь

Если вам по-прежнему нужна помощь службы поддержки Apigee, перейдите к разделу Сбор диагностической информации.

Как получить диагностическую информацию

Если проблема не исчезнет после выполнения описанных выше инструкций, соберите указанную ниже диагностическую информацию и обратитесь в службу поддержки Apigee Edge.

Если вы пользователь общедоступного облака, предоставьте следующую информацию:

  • Название организации
  • Название среды
  • Название прокси API
  • Полная команда curl, использованная для воспроизведения 500 Internal Server Error с кодом ошибки protocol.http.EmptyPath
  • Файл трассировки для запросов к API

Если вы используете частное облако, предоставьте следующую информацию:

  • Полное сообщение об ошибке, которое появляется при неудачных запросах.
  • Название среды
  • Пакет прокси-сервера API
  • Файл трассировки для запросов к API
  • Журналы доступа NGINX:

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

    Где: ORG, ENV и PORT# заменяются фактическими значениями.

  • Системные журналы Message Processor /opt/apigee/var/log/edge-message- processor/logs/system.log

Ссылки

Переменные потока – цель