Назад | Перейти на главную страницу

NGINX Wordpress REST API не работает с разрешить / запретить в блоке местоположения

Я пытаюсь ограничить доступ к REST API WordPress с помощью NGINX (это основной бэкэнд server {} блок, без прокси):

location ~ ^/wp-json/ {
    allow x.x.x.x;
    deny all;
}

Проблема в том, что WordPress всегда возвращает 404 при попытке доступа к конечной точке API (www.example.com/wp-json/wp/v2/pages например) с этой конфигурацией (независимо от того, является ли это браузер, который передает все файлы cookie и авторизации, или cURL):

curl -X GET -Ik https://www.example.com/wp-json/wp/v2/taxonomies
HTTP/2 404
date: Thu, 17 Jan 2019 12:40:12 GMT
content-type: application/json; charset=UTF-8
x-robots-tag: noindex
x-content-type-options: nosniff
access-control-expose-headers: X-WP-Total, X-WP-TotalPages
access-control-allow-headers: Authorization, Content-Type

Но как только я прокомментирую location block, я не получаю ошибок при входе на сайт с помощью браузера.

Я боюсь, что это произойдет, потому что мне нужно передать некоторые HTTP-заголовки для целей авторизации, поскольку у меня есть эти HTTP-заголовки в моем ЗАПРОСЕ (проверено с помощью chrome devtools):

:authority: www.example.com
:method: GET
:path: /wp-json/wp/v2/taxonomies?context=edit&lang=en&_locale=user
:scheme: https
accept: application/json, */*;q=0.1
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9
(!) ---> authorization: Basic crf344...fdfs334
cache-control: no-cache
(!) ---> cookie: wordpress_test_cookie=WP+Cookie+check; wordpress_logged_in_282...7da; wp-settings-1=mfo...off; wp-settings-time-1=1547726728
pragma: no-cache
referer: https://www.example.com/wp-admin/post.php?post=193&action=edit
(!) ---> x-wp-nonce: df238g3ds2

Может ли кто-нибудь помочь мне, пожалуйста, чтобы настроить location правильно заблокировать для WordPress REST API?

РЕДАКТИРОВАТЬ:

Мне удалось получить 200 с участием cURL если я добавлю соответствующие заголовки HTTP:

curl -X GET -H "authorization: Basic c2F...TVY" \
     -H "cookie: wordpress_test_cookie=WP+...7da; \
                 wp-settings-1=mfo...off; \
                 wp-settings-time-1=1547726728"
     -H "x-wp-nonce: df238g3ds2" \
     -H "referer: https://www.example.com/wp-admin/post.php?post=193&action=edit" \
     -I https://www.example.com/wp-json/wp/v2/pages

Как я мог сделать то же самое с NGINX location блок?

как вы просили, я отправляю свои комментарии в качестве ответа:

Вместо использования регулярного выражения (которое может быть немного медленнее) вы можете использовать простое местоположение. Кроме того, поскольку логика перенаправления "красивые" постоянные ссылки правильный файл PHP находится внутри другой директивы местоположения, вам необходимо скопировать его в новое пользовательское местоположение:

location /wp-json/ {
    allow x.x.x.x;
    deny all;
    try_files $uri $uri/ /index.php?$args;
}

ПРИМЕЧАНИЕ: вам может потребоваться отрегулировать фактическое try_files расположение