Estou tentando restringir o acesso a uma API REST do WordPress com NGINX (é o principal server {}
bloco de back-end, sem proxy):
location ~ ^/wp-json/ {
allow x.x.x.x;
deny all;
}
O problema é que o WordPress sempre retorna um 404
ao tentar acessar um endpoint da API ( www.example.com/wp-json/wp/v2/pages
por exemplo) com essa configuração (não importa se é o navegador, que está passando todos os cookies e coisas de autorização, ou 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
Mas uma vez que comento o location
bloco, não recebo erros ao acessar o site com um navegador.
Receio que isso aconteça porque preciso passar alguns cabeçalhos HTTP para fins de autorização, pois tenho esses cabeçalhos HTTP no meu REQUEST (verificado com 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
Alguém poderia me ajudar por favor para configurar o location
bloco corretamente para a API REST do WordPress?
EDITAR:
Consegui obter um 200
com cURL
se adicionar os cabeçalhos HTTP correspondentes:
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
Como eu poderia fazer o mesmo com o location
bloco NGINX?
como você pediu, estou postando meus comentários como resposta:
Em vez de usar regex (que pode ser um pouco mais lento), você pode usar um local simples. Além disso, como a lógica para redirecionar os links permanentes "bonitos" para o arquivo PHP correto está dentro de outra diretiva de localização, você precisa copiá-la para seu novo local personalizado:
NOTA: pode ser necessário ajustar a
try_files
localização real