wp-json/ возвращает 404, но wp-json/wp/v2/ работает нормально на моем nginx сервере
Когда я обращаюсь к моему 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']);
больше не требуется.
Только что столкнулся с той же проблемой на чистой установке 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']);

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

Может ли это быть связано с https://core.trac.wordpress.org/ticket/39432
Симптомы выглядят очень похоже, и на момент написания исправление ещё не было выпущено в версии 4.7.3. Ручное применение патча решило проблему в моей конфигурации nginx.

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

У меня сработало с предложенной настройкой 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-сайтов должны быть правильные постоянные ссылки, проверьте и этот момент!
