023_nginx跨域问题

什么是跨域?

使用js获取数据时,涉及到的两个url只要协议、域名、端口有任何一个不同,都被当作是不同的域,相互访问就会有跨域问题。
例如客户端的域名是www.redis.com.cn,而请求的域名是www.264.cn
如果直接使用ajax访问,会有以下错误
XMLHttpRequest cannot load http://www.264.cn/server.php. No 'Access-Control-Allow-Origin' header is present on the requested resource.Origin 'http://www.redis.com.cn' is therefore not allowed access.

如何解决跨域?

在服务器页面的Response header中加入如下内容,可以实现POST跨域。
// 指定允许其他域名访问
header('Access-Control-Allow-Origin:*');
// 响应类型
header('Access-Control-Allow-Methods:POST');
// 响应头设置
header('Access-Control-Allow-Headers:x-requested-with,content-type');

Access-Control-Allow-Origin:* 表示允许任何域名跨域访问
如果需要指定某域名才允许跨域访问,只需把Access-Control-Allow-Origin:*改为Access-Control-Allow-Origin:允许的域名
例如:header('Access-Control-Allow-Origin:http://www.redis.com.cn');

1.nginx配置文件增加响应头

在服务器端的nginx.conf中配置增加配置

 
1
2
3
4
5
6
7
{
.
;
;
;
.
}

这样就可以实现GET,POST,OPTIONS的跨域请求的支持

2.修改php代码加入响应头

例如,server.php 路径:http://www.264.cn/server.php

 
1
2
3
4
5
6
7
8
9
10
11
12
13
  
  
  
  
  
  
  
  
  
  
  
  
?>

3.修改客端的nginx配置,利用反向代理来实现

例如,www.redis.com.cn/html/request.html 想请求www.264.cn/api/msg?method=1&para=2;

 
1
2
3
4
5
6
7
'www.264.cn/api/msg?method=1&para=2';
{
,
,
,
.
)

变成访问本地域名地址

 
1
2
3
4
5
6
7
8
'http://www.264.cn/api/msg?method=1&para=2';
'msg?method=1&para=2';
{
,
,
,
.
)

通过nginx中增加location反向代理到服务器端

 
 
1
2
3
4
{
;
//www.redis.com.cn/api/;
}