Можно ли разрешить только одному IP-адресу делать запросы POST и отказывать всем остальным на тех же основаниях на NGINX?
Увидел ответ связанных с этим, но предлагаемое там решение требует, чтобы правило применялось на всем сервере. Мне нужно сделать это на уровне виртуального хоста, не затрагивая другие сайты, размещенные на том же сервере.
В каталоге виртуального хоста создайте файл .htaccess.
Вы можете использовать такие правила для отклонения всех запросов на публикацию:
# deny all POST requests
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_METHOD} POST
RewriteRule .* - [F,L]
</IfModule>
Затем разрешите белый список:
# whitelist POST requests
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} !/contact.php [NC]
RewriteCond %{REMOTE_ADDR} !127.0.0.1
RewriteRule .* - [F,L]
</IfModule>
Больше информации о этот сайт
РЕДАКТИРОВАТЬ: для NGINX вы можете изменить правило прецедента с помощью этот онлайн-инструмент, например:
if ($request_method ~ "POST"){
set $rule_0 1$rule_0;
}
if ($rule_0 = "1"){
return 403;
break;
}
if ($request_method ~ "POST"){
set $rule_0 1$rule_0;
}
if ($remote_addr !~ "127.0.0.1"){
set $rule_0 3$rule_0;
}
if ($rule_0 = "321"){
return 403;
break;
}
Нужный вам ответ похож на вот этот.
Вам дополнительно понадобится чек для публикации, который будет ($request_method = POST )
.
Таким образом, блок будет выглядеть примерно так (что я не смог проверить):
location @location {
if ($request_method = POST) {
allow IP;
deny all;
}
}
Документы для модуля доступа есть Вот.