« 上一篇下一篇 »

如何允许跨域访问?利用map实现Nginx允许多个域名跨域的解决方案

   跨域是指从一个域名的网页去请求另一个域名的资源。 跨域的严格一点的定义是:只要 协议,域名,端口有任何一个的不同,就被当作是跨域访问。浏览器限制跨域访问,为什么?
 为了安全我们的浏览器有同源策略。使我们不方便跨域访问
   这篇文章主要给大家介绍了关于如何利用map实现Nginx允许多个域名跨域的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

 

常见的 Nginx 配置允许跨域

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
 listen    11111;
 server_name localhost;
 location ~ /xxx/xx {
   if ($request_method = 'OPTIONS') {
     return 204;
   }
   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,Authorization';
   proxy_pass http://1.2.3.4:5678;
 }
}
 

指定 Access-Control-Allow-Origin 为 ‘*' ,即为最简单暴力的允许所有访问跨域

允许 Cookie

有些场景下需要使用 Cookie,这时 Nginx 需要加一句 add_header Access-Control-Allow-Credentials 'true';,但此时会发现浏览器报错,说该参数为 true 时,allow origin 不能设置为 ‘*‘,如果手动指定了多个域名,那同样会被浏览器提示错误,说 allow origin 不能设置多个,这些是协议层面的限制

使用 map

在 Nginx 中可以使用 map 得到一个自定义变量,简单的使用可以参考官方文档,在上面提到的场景中,可以对请求中的 origin 做一个过滤处理,把符合要求的请求域名放到一个变量中,在设置 allow origin 时使用该变量就能实现一个动态的、多个的允许跨域域名

一个示例配置如下:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
map $http_origin $allow_origin {
 default "";
 "~^(https?://localhost(:[0-9]+)?)" $1;
 "~^(https?://127.0.0.1(:[0-9]+)?)" $1;
 "~^(https?://172.10(.[\d]+){2}(:[0-9]+)?)" $1;
 "~^(https?://192.168(.[\d]+){2}(:[0-9]+)?)" $1;
}
server {
 listen    11111;
 server_name localhost;
 location ~ /xxx/xx {
   if ($request_method = 'OPTIONS') {
     return 204;
   }
   add_header Access-Control-Allow-Origin $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,Authorization';
   add_header Access-Control-Allow-Credentials 'true';
   proxy_pass http://1.2.3.4:5678;
 }
}
解释说明:

$http_origin 是 Nginx 的内部变量,用于获取请求头中的 origin

$allow_origin 是可以自定义的变量名

总结

到此这篇关于如何利用map实现Nginx允许多个域名跨域的文章就介绍到这了,更多相关map实现Nginx允许多个域名跨域内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!