У меня есть развертывание Kubernetes, для которого требуется следующая конфигурация:
Я придумал:
include modules/*.conf;
worker_processes 1;
error_log /dev/stdout info;
events {
worker_connections 1024;}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log /dev/stdout main;
sendfile on;
keepalive_timeout 65;
server {
listen 8080;
server_name localhost;
port_in_redirect off;
location / {
root html;
index index.html;
}
error_page 403 /403.html;
error_page 404 /404.html;
error_page 500 /500.html;
error_page 502 /502.html;
error_page 503 /503.html;
error_page 504 /504.html;
}
}
if ($request_method != POST) {
limit_except GET DELETE PUT{
allow 10.0.0.0/8;
deny all;
}
}
Но я все еще могу ПОЛУЧИТЬ из внешней сети
Единственный допустимый контекст для то limit_except
директива является расположение, и семантика этой директивы состоит в том, чтобы ограничить использование HTTP-методов, которые не явно исключено.
Вам нужна такая строфа:
location / {
root /usr/share/nginx/html;
index index.html;
limit_except POST {
allow 10.0.0.0/8;
deny all;
}
}
Я бы не стал использовать "если" из-за производительность и другие причины.
Что-то вроде этого могло бы быть лучше, если бы вы могли разделить свои URL-адреса таким образом. Ключ limit_except. Есть вероятность, что у меня есть параметры в обратном порядке (поменять местами GET на POST), и, возможно, потребуется пересмотреть «отклонить все», но эта общая идея должна помочь решить проблему. Я обновлю ответ на основе любых комментариев.
location /post/service {
root html;
index index.html;
// OR proxy_pass http://whatever;
// ALLOW POST
limit_except GET {
deny all;
}
}
location / {
root html;
index index.html;
// OR proxy_pass http://whatever;
// ALLOW GET
limit_except POST {
deny all;
}
}