Access-Control-Allow-Origin 是一个 HTTP 协议的响应头,用于指示哪些源(即协议、域名和端口)有权接收来自服务器的响应。
Access-Control-Allow-Origin 头部字段主要用于处理浏览器的跨域请求。
跨域请求(Cross-Origin Request)指的是从一个域名(源)的资源去请求另一个域名(目标)的资源。在Web开发中,由于同源策略(Same-Origin Policy)的限制,浏览器默认不允许跨域请求,这是为了保护用户数据的安全,防止恶意网站通过跨站请求伪造(CSRF)等方式窃取用户信息。
为了满足需求,HTTP 协议的 Access-Control-Allow-Origin 头支持以下几种写法:
指定一个确切的域名,只有该域名下的网页才能访问资源。例如:
Access-Control-Allow-Origin: https://example.com
通过空格分隔多个域名,允许这些域名下的网页访问资源。例如:
Access-Control-Allow-Origin: https://example.com https://another-example.com
星号表示允许所有域名进行访问,这在开发环境中可能很有用,但在生产环境中通常不推荐使用,因为它可能导致安全风险。例如:
Access-Control-Allow-Origin: *
如果要支持带有凭证(如 cookies、HTTP 认证或客户端 SSL 证明)的跨域请求,你需要将域名明确指定,并且不能是通配符 *。例如:
Access-Control-Allow-Origin: https://example.com Access-Control-Allow-Credentials: true
在某些情况下,你可能会看到空字符串作为 Access-Control-Allow-Origin 的值。这通常意味着不允许任何跨域请求。例如:
Access-Control-Allow-Origin:
你还可以在域名后指定端口号,以允许来自特定端口的请求。例如:
Access-Control-Allow-Origin: https://example.com:8080
在 Nginx 中,使用 add_header 指令设置 Access-Control-Allow-Origin 的值,例如:
server { listen 80; server_name example.com; location / { # ... 其他配置 ... # 设置 Access-Control-Allow-Origin 头 add_header Access-Control-Allow-Origin "https://example.com"; # 如果需要支持带有凭证的跨域请求 add_header Access-Control-Allow-Credentials true; } }
注意:出于安全考虑,如果你设置 Access-Control-Allow-Credentials 为 true,那么 Access-Control-Allow-Origin 就不能设置为通配符 *,而必须是一个明确的域名。这是因为带有凭证的请求需要更严格的源检查,以防止安全漏洞。