Nginx解决跨域问题(CORS)

0x0前言

CORS(Cross-Origin Resource Sharing) 跨域资源共享,是一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domain)的脚本请求访问的机制,通常由于同域安全策略(the same-origin security policy)浏览器会禁止这种跨域请求。
如:a.com 请求b.com的资源时,就涉及到了跨域。目前常见的跨域解决方案一般分为如下几类:

  • jsonp返回值解决get请求
  • iframe解决跨域访问
  • Nginx 解决CORS

0x1 Nginx配置

0x1_1简单配置:

server {
        listen       80;
        server_name  b.com;
        location /{
            add_header 'Access-Control-Allow-Origin' 'http://a.com';
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Methods' 'GET';
        }
}
  • add_header:授权从a.com的请求

  • 第二条add_header:当该标志为真时,响应于该请求是否可以被暴露

  • 第三条add_header:指定请求的方法,可以是GET,POST,PUT,DELETE,HEAD
    同样支持通配符,如允许来自任何域的请求:

server {
        listen 80;
        server_name b.com;
        location /{
            Access-Control-Allow-Origin: *
        }
    }

0x1_2 高级配置

location / {
     if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        #
        # Custom headers and headers various browsers *should* be OK with but aren't
        #
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
        #
        # Tell client that this pre-flight info is valid for 20 days
        #
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain charset=UTF-8';
        add_header 'Content-Length' 0;
        return 204;
     }
     if ($request_method = 'POST') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
     }
     if ($request_method = 'GET') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
     }
}

因为POST跨域请求会先发一次OPTIONS的嗅探请求,所有有的场景涉及到设置OPTIONS。

0x2 参考文献

0x3关于我

  • @Author:Zemo
  • @Email:zemochen#126.com
  • 欢迎转载,让更多的人学到东西
### 解决 Nginx 中与前端相关的问题 为了使前端项目能够正常处理请求,可以通过配置 Nginx 来实现资源共享 (CORS)。以下是具体的解决方案: #### 1. 安装和确认 Nginx 是否已安装 确保服务器上已经安装了 Nginx。如果没有安装,则需要根据操作系统使用对应的包管理工具完成安装[^3]。 #### 2. 修改 Nginx 配置文件 打开 Nginx配置文件(通常路径为 `/etc/nginx/nginx.conf` 或 `/etc/nginx/conf.d/default.conf`)。在 `server` 块中添加或调整如下内容来支持请求: ```nginx http { server { listen 80; server_name your-domain.com; location /api/ { add_header 'Access-Control-Allow-Origin' '*'; # 允许所有名访问 add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type'; if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type'; return 204; # 对预检请求返回成功状态码 } proxy_pass http://backend-server-address/; } } } ``` 上述配置实现了以下功能: - **设置允许的源 (`Access-Control-Allow-Origin`):** 将其设为通配符 (*) 表示允许任何来源访问服务[^2]。 - **定义允许的方法 (`Access-Control-Allow-Methods`) 和头字段 (`Access-Control-Allow-Headers`):** 明确指定哪些 HTTP 方法以及自定义头部被接受。 - **处理预检请求 (Preflight Request)**:对于某些复杂请求(如带有自定义头部的 POST 请求),浏览器会发送一个 OPTIONS 请求作为预检。这里通过判断 `$request_method` 并返回适当的状态码 204 处理该情况。 #### 3. 测试并重新加载 Nginx 配置 保存更改后的配置文件后,测试语法是否正确,并重载 Nginx 使其应用新的配置: ```bash sudo nginx -t sudo systemctl reload nginx ``` 如果一切无误,Nginx 应当按照新设定工作,从而解决前端项目的问题[^4]。 --- ### 注意事项 - 如果仅希望特定名能访问 API 接口而不是全部开放给互联网上的任意站点,请将 `'Access-Control-Allow-Origin' '*'` 替换为目标网站的具体 URL 地址。 - 当遇到错误代码如 502 Bad Gateway 时,可能是因为反向代理目标不可达等原因引起;此时需核查上游服务器地址是否填写准确以及网络连通状况良好[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值