You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的配置为准,防止头重复或逻辑冲突。

生效步骤

  1. 修改配置后,先测试语法:sudo nginx -t
  2. 重载NGINX使配置生效:sudo systemctl reload nginx

如果需要支持HTTPS(强烈建议,因为你的允许来源是HTTPS),请在443端口的server块中复制同样的CORS和拦截逻辑。

内容的提问来源于stack exchange,提问作者Samuel Levy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:53:20