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代理就成功了。