wp-json/ возвращает 404, но wp-json/wp/v2/ работает нормально на моем nginx сервере

24 янв. 2017 г., 07:40:10
Просмотры: 35.4K
Голосов: 3

Когда я обращаюсь к моему WordPress сайту по адресу www.example.com/wp-json/, я получаю эту 404 ошибку.

{"code":"rest_no_route","message":"Не найден маршрут, соответствующий URL и методу запроса","data":{"status":404}}

Но REST API возвращает правильный JSON объект, если я использую URL www.example.com/wp-json/wp/v2/.

Мои постоянные ссылки настроены как /%year%/%monthnum%/%postname%/, и вот часть моих настроек конфигурации nginx:

server {

    root /var/www/html;
    index index.php index.html index.htm;

    location / {
      try_files $uri $uri/ /index.php$is_args$args;
    }

    # другие директивы location связанные с php, кэшем и т.д.

}

Я искал в интернете, и большинство проблем, похоже, вызваны неправильными настройками постоянных ссылок и .htaccess (Apache), но редко упоминаются случаи, связанные с nginx. Есть идеи, что вызывает это и как решить?

Обновление

Если я выполняю curl -i www.example.com/wp-json, вот что я получаю:

HTTP/1.1 404 Not Found
Server: nginx
Date: Sun, 29 Jan 2017 11:58:21 GMT
Content-Type: application/json; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
X-Robots-Tag: noindex
Link: <https://example.com/wp-json/>; rel="https://api.w.org/"
X-Content-Type-Options: nosniff
Access-Control-Expose-Headers: X-WP-Total, X-WP-TotalPages
Access-Control-Allow-Headers: Authorization, Content-Type

{"code":"rest_no_route","message":"Не найден маршрут, соответствующий URL и методу запроса","data":{"status":404}}

Последнее обновление (7 марта 2017)

С выходом WordPress 4.7.3 этот баг был исправлен. Обходное решение unset ($_SERVER['PATH_INFO']); больше не требуется.

7
Комментарии

Что вы ожидаете найти по адресу wp-json/?

Nathan Powell Nathan Powell
24 янв. 2017 г. 08:42:12

Используете ли вы плагин для доступа к API?

Nathan Powell Nathan Powell
24 янв. 2017 г. 08:45:59

При обращении к wp-json/ я ожидал увидеть тот же результат, что и по wp-json/wp/v2 - такое поведение было корректным на моем другом сервере с Apache. Нет, у меня нет плагина для REST. Моя WordPress версии 4.7, я думал, что для REST API больше не требуется плагин.

hcheung hcheung
24 янв. 2017 г. 09:51:09

Больше не требуется иметь плагин, но похоже, что основные конечные точки используют версию v2. Возможно, дело не в Apache vs nginx, а в том, что вы ранее использовали плагин?

Nathan Powell Nathan Powell
24 янв. 2017 г. 10:02:14

Нет, я никогда не использовал плагин, как упоминалось в моем предыдущем сообщении, что при тех же настройках WordPress на сервере Apache всё работает без плагина.

hcheung hcheung
24 янв. 2017 г. 13:26:19

Вам удалось решить эту проблему? У меня такая же ситуация

Snowball Snowball
13 февр. 2017 г. 08:36:14

Нет, я пока не получил ни одного содержательного комментария.

hcheung hcheung
13 февр. 2017 г. 14:10:52
Показать остальные 2 комментариев
Все ответы на вопрос 4
1

Только что столкнулся с той же проблемой на чистой установке WordPress 4.7.2 с использованием только nginx (без Apache).

Базовые URL-адреса /wp-json/ и index.php?rest_route=/ возвращали ошибку rest_no_route 404, в то время как все запросы к /wp-json/wp/v2/ работали корректно.

Проблема оказалась связана с переменной PATH_INFO, передаваемой nginx, которую ядро WordPress некорректно использует для построения URL, если она установлена в любое значение, даже пустую строку.

Требуется дополнительное исследование, но мне удалось решить проблему, добавив условие для этих конкретных страниц через REQUEST_URI следующим образом:

unset($_SERVER['PATH_INFO']);
17 февр. 2017 г. 01:18:35
Комментарии

Ах, спасибо @user113522, теперь я понимаю, почему это произошло. WordPress действительно полагается на .htaccess для обработки редиректов, но в случае с Nginx, Nginx не использует .htaccess. Когда WordPress не может найти .htaccess, он переключается на использование PATH_INFO, что добавляет лишний index.php в URL. Ваше решение с добавлением unset($_SERVER['PATH_INFO']); работает, но я думаю, что лучше настроить редирект в директиве location Nginx. Я протестирую это, когда будет время, и позже опубликую здесь.

hcheung hcheung
22 февр. 2017 г. 08:19:52
2

Может ли это быть связано с https://core.trac.wordpress.org/ticket/39432

Симптомы выглядят очень похоже, и на момент написания исправление ещё не было выпущено в версии 4.7.3. Ручное применение патча решило проблему в моей конфигурации nginx.

20 февр. 2017 г. 21:58:17
Комментарии

Спасибо за ссылку. Это действительно решает проблему, но поскольку изменения касаются кода в /wp-includes, я предпочел бы не вносить правки таким способом. Сейчас у меня версия 4.7.2, надеюсь, это будет исправлено в предстоящем релизе 4.7.3. Пока что я последовал инструкции @user113522 и сбросил $_SERVER['PATH_INFO'].

hcheung hcheung
22 февр. 2017 г. 16:59:32

Изменение ядра специально для этого патча не имеет особого смысла, так как при обновлении всё перезапишется тем же самым кодом.

lkraav lkraav
22 февр. 2017 г. 20:30:45
0

Для меня смена постоянных ссылок на что-то более осмысленное, чем первый вариант, решила проблему.

30 мая 2017 г. 13:16:41
0

У меня сработало с предложенной настройкой nginx от WordPress.

Добавьте это в ваш nginx.conf:

location /wp-json/ { # Решает проблему 404 в WP Gutenberg
  try_files $uri $uri/ /index.php;
}

И измените настройки "Постоянных ссылок" на "Название записи".

Это должно решить проблему с /wp-json.

Ссылка на документацию: https://wordpress.org/support/article/nginx/

Я настроил сетевой сайт с помощью данных инструкций, и всё заработало как надо. Стоит попробовать!

Также для HTTPS-сайтов должны быть правильные постоянные ссылки, проверьте и этот момент!

5 дек. 2020 г. 13:55:22