使用通配符域名在 nginx 中设置 Access-Control-Allow-Origin

使用通配符域名在 nginx 中设置 Access-Control-Allow-Origin

我可以使用通配符来nginx指定吗?Access-Control-Allow-Origin*.mydomain.com

它看起来会像这样吗:

add_header Access-Control-Allow-Origin *.mydomain.com;

谢谢。

答案1

当然可以。我使用以下指令来支持我们的一些跨域字体:

  add_header Access-Control-Allow-Origin *;

答案2

你必须用 if 条件来做

location /  {
  set $cors "";
  if ($http_origin ~* (\.mydomain\.com|\.myseconddomain\.com)$) {
      set $cors "true";
  }

  proxy_pass http://backend:10005/apathifyouwantso/;

  if ($cors = "true") {
    add_header 'Access-Control-Allow-Origin' "$http_origin";
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT';
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Headers' 'User-Agent,Keep-Alive,Content-Type';
  }
}

答案3

在 nginx 中根据条件设置“Access-Control-Allow-Origin”非常危险,应谨慎使用。上面的答案是打开安全漏洞。

if ($http_origin ~* (\.mydomain\.com|\.myseconddomain\.com)) 

此行将匹配 something.mydomain.com 以及 something.mydomain.com.anyotherdomain.com (任何人都可以创建的域)

这样做将会出现以下情况:

  1. 横幅让用户打开something.mydomain.com.anyotherdomain.com
  2. 它使用 向您的网站发出请求fetch
  3. 获取,可以包含凭证,也就是您的用户 cookie。
  4. 因此攻击者可以以该用户的身份向您的服务器发出请求。(例如:发送消息、电子邮件等)

而所有这些,都是因为正则表达式末尾缺少一个“$”。

if ($http_origin ~* (\.mydomain\.com|\.myseconddomain\.com)$) 

这不是使特定正则表达式变得不好的唯一方法,这就是我解释这个问题的原因,而不是仅仅在前面的答案中添加 $

相关内容