我有一个 kubernetes 部署,需要以下配置:
- 必须允许来自任何来源的 POST。
- GET、HEAD、LIST必须限制在内联网内。
我想到了:
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;
}
}
但我仍然可以从外部网络获取
答案1
我不会使用“if”,因为性能和其他原因。
如果你能用这种方式分隔你的 URL,那么效果会更好。关键是limit_except。我可能把参数弄反了(用 POST 替换 GET),可能需要重新检查“全部拒绝”,但这个总体思路应该有助于解决问题。我会根据任何评论更新答案。
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;
}
}
答案2
唯一有效的背景指令limit_except
是地点,该指令的语义是限制使用不是明确除外。
你想要一个这样的诗节:
location / {
root /usr/share/nginx/html;
index index.html;
limit_except POST {
allow 10.0.0.0/8;
deny all;
}
}