NGINX未拦截非指定源请求求助(Express+PM2+Ubuntu EC2环境)
解决NGINX拦截非指定Origin请求的问题
你当前的配置仅添加了CORS响应头,但没有在服务器端实际拦截非允许的请求——CORS本身是浏览器端的限制,服务器依然会接收所有请求并转发给后端。要真正实现拦截,需要在NGINX中添加请求校验逻辑,同时修正CORS头的配置逻辑。
修正后的NGINX配置
# 在http块中添加(所有server块之外) map $http_origin $allowed_origin { default ""; "https://example.com" "https://example.com"; } server { listen 80; listen [::]:80; server_name api.mysite.com; # 直接拦截非允许来源的请求 if ($allowed_origin = "") { return 403; } location / { # 处理OPTIONS预检请求(CORS必备) if ($request_method = OPTIONS) { add_header "Access-Control-Allow-Origin" $allowed_origin; add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS"; add_header "Access-Control-Allow-Headers" "Authorization"; add_header "Access-Control-Max-Age" 1728000; # 缓存预检结果20天 add_header "Content-Type" "text/plain; charset=utf-8"; add_header "Content-Length" 0; return 204; } # 代理到Express后端 proxy_pass http://127.0.0.1:8001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 仅向允许的来源返回CORS头 add_header "Access-Control-Allow-Origin" $allowed_origin; add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS"; add_header "Access-Control-Allow-Headers" "Authorization"; } }
关键修改说明
- 服务器端拦截:通过
map定义允许的Origin列表,用if判断直接返回403给非允许来源,从根源上阻止请求到达后端。 - 动态CORS头:用
$allowed_origin变量代替硬编码值,确保只有合法来源才会收到CORS响应头,避免无效头导致的浏览器警告。 - 预检请求处理:单独处理OPTIONS请求,直接返回204,不用转发给后端,提升性能并符合CORS规范。
- 避免冲突:建议关闭Express中的CORS配置,以NGINX的配置为准,防止头重复或逻辑冲突。
生效步骤
- 修改配置后,先测试语法:
sudo nginx -t - 重载NGINX使配置生效:
sudo systemctl reload nginx
如果需要支持HTTPS(强烈建议,因为你的允许来源是HTTPS),请在443端口的server块中复制同样的CORS和拦截逻辑。
内容的提问来源于stack exchange,提问作者Samuel Levy
相关产品推荐
相关产品推荐

