1.什么是跨域以及产生原因跨域是指a页面想获取b页面资源 , 如果a、b页面的协议、域名、端口、子域名不同 , 或是a页面为ip地址 , b页面为域名地址 , 所进行的访问行动都是跨域的 , 而浏览器为了安全问题一般都限制了跨域访问 , 也就是不允许跨域请求资源 。
文章插图
2.跨域的常见解决方法目前来讲没有不依靠服务器端来跨域请求资源的技术
1.jsonp 需要目标服务器配合一个callback函数 。
2.window.name+iframe 需要目标服务器响应window.name 。
3.window.location.hash+iframe 同样需要目标服务器作处理 。
4.html5的 postMessage+ifrme 这个也是需要目标服务器或者说是目标页面写一个postMessage , 主要侧重于前端通讯 。
5.CORS 需要服务器设置header :Access-Control-Allow-Origin 。
6.Nginx反向代理 这个方法一般很少有人提及 , 但是他可以不用目标服务器配合 , 不过需要你搭建一个中转nginx服务器 , 用于转发请求 。
当然 , Apache 也可以做反向代理 , 原理差不多 , 见上一篇文章 , 此处不多说 。
nginx反向代理具体配置redis.conf文件如下:
## Basic reverse proxy server ##
## Apache backend for www.redis.com.cn ##
upstream apachephp {
server ip:8080; #Apache
}
## Start www.redis.com.cn ##
server {
listen 80;
server_name www.redis.com.cn;
access_log logs/redis.access.log main;
error_log logs/redis.error.log;
root html;
index index.html index.htm index.php;
## send request back to apache ##
location / {
proxy_pass http://apachephp;
#Proxy Settings
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
## End www.redis.com.cn ##
以下做一个解释:1.'^~ /proxy/html/ '
就像上面说的一样是一个匹配规则 , 用于拦截请求 , 匹配任何以 /proxy/html/开头的地址 , 匹配符合以后 , 停止往下搜索正则 。
2.rewrite ^/proxy/html/(.*)$ /$1 break;
代表重写拦截进来的请求 , 并且只能对域名后边的除去传递的参数外的字符串起作用 , 例如www.c.com/proxy/html/api/msg?method=1¶=2重写 。只对/proxy/html/api/msg重写 。
rewrite后面的参数是一个简单的正则 ^/proxy/html/(.*)$ ,$1代表正则中的第一个(),$2代表第二个()的值,以此类推 。
break代表匹配一个之后停止匹配 。
3.proxy_pass
既是把请求代理到其他主机 , 其中 http://www.b.com/ 写法和 http://www.b.com写法的区别如下:
不带/
location /html/
{
proxy_pass http://b.com:8300;
}
带/
location /html/
{
proxy_pass http://b.com:8300/;
}
上面两种配置 , 区别只在于proxy_pass转发的路径后是否带 “/” 。
针对情况1 , 如果访问url = http://server/html/test.jsp , 则被nginx代理后 , 请求路径会便问http://proxy_pass/html/test.jsp , 将test/ 作为根路径 , 请求test/路径下的资源 。
针对情况2 , 如果访问url = http://server/html/test.jsp , 则被nginx代理后 , 请求路径会变为 http://proxy_pass/test.jsp , 直接访问server的根资源 。
【nginx反向代理机制解决前端跨域问题】修改配置后重启nginx代理就成功了 。
推荐阅读
- 安全访问:nginx用户访问认证
- linux+nginx+mysql+php新增https访问
- 不同网段IP地址分配,Windows server 2008 R2使用DHCP中继代理
- Nginx 实现灰度发布的三种方法总结
- nginx端口转发,管理自己的项目
- 淘宝做代理一个月能挣多少 淘宝代销怎么赚钱
- 搞懂nginx 这一篇就够了
- 面试官问 Spring AOP 中两种代理模式的区别,我懵逼了
- nginx报错111: Connection refused
- 深入浅出Nginx