Nginx如何支持跨域访问?

Nginx可以通过跨域资源共享(CORS)解决跨域问题。跨域访问指的是访问不同域、协议或端口的资源,由于浏览器同源策略限制,需要服务器端设置允许跨域。

Nginx跨域支持主要通过添加响应头实现:

  • Access-Control-Allow-Origin:指定允许的来源域,可以为’*’允许任何域
  • Access-Control-Allow-Methods:允许的HTTP请求方法,如GET, POST等
  • Access-Control-Allow-Headers:允许请求的请求头
  • Access-Control-Allow-Credentials:是否允许发送Cookie

配置示例:

location /api/ {
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}

location /api/get { 
    add_header Access-Control-Allow-Origin 'http://example.com';
    add_header Access-Control-Allow-Credentials true;
    add_header Access-Control-Allow-Methods 'GET';
}
  • 第一个location允许来自任何域的GET、POST、OPTIONS请求,允许指定请求头
  • 第二个location仅允许来自http://example.com,且可以发送Cookie

客户端(非同源)发起的跨域请求,浏览器会首先进行预检请求(OPTIONS),确认服务器端是否允许。上例配置了OPTIONS方法和请求头,预检请求会被服务器接受,继续发送实际请求。