Я пытаюсь ограничить доступ к 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
расположение