织梦建站教程全集,wordpress评论框函数,记事本做网站怎么加图片,做同城服务网站比较成功的网站在前面写的一篇文章SpringMVC解决跨域问题#xff0c;我们探讨了什么是跨域问题以及SpringMVC怎么解决跨域问题#xff0c;解决方式主要有如下三种方式:JSONPCORSWebSocket可是这几种方式都是基于服务器配置的#xff0c;即对于自己的网站是可以通过这几种方式解决的#x…在前面写的一篇文章SpringMVC解决跨域问题我们探讨了什么是跨域问题以及SpringMVC怎么解决跨域问题解决方式主要有如下三种方式:JSONPCORSWebSocket可是这几种方式都是基于服务器配置的即对于自己的网站是可以通过这几种方式解决的可是现在遇到另一个需求(前面提到过写扇贝插件我们不能更改扇贝的服务器配置也不能发短信叫他们给我配置一下)。本文探讨了前端如何通过Nginx反向代理的方式解决跨域问题。跨域再次重申 跨域是浏览器行为不是服务器行为。实际上请求已经到达服务器了只不过在回来的时候被浏览器限制了。就像Python他可以进行抓取数据一样不经过浏览器而发起请求是可以得到数据想到通过Nginx的反向代理来解决跨域问题。代理所谓代理就是在我们和真实的服务器之间有一台代理服务器我们所有的请求都是通过它来进行转接的。正向代理正向代理就是我们访问不了Google但是我在国外有一台vps它可以访问Google我访问它叫它访问Google后把数据传给我。如图反向代理大家都有过这样的经历拨打10086客服电话可能一个地区的10086客服有几个或者几十个你永远都不需要关心在电话那头的是哪一个叫什么男的还是女的漂亮的还是帅气的你都不关心你关心的是你的问题能不能得到专业的解答你只需要拨通了10086的总机号码电话那头总会有人会回答你只是有时慢有时快而已。那么这里的10086总机号码就是我们说的反向代理。客户不知道真正提供服务人的是谁。反向代理隐藏了真实的服务端当我们请求 www.baidu.com 的时候就像拨打10086一样背后可能有成千上万台服务器为我们服务但具体是哪一台你不知道也不需要知道你只需要知道反向代理服务器是谁就好了www.baidu.com 就是我们的反向代理服务器反向代理服务器会帮我们把请求转发到真实的服务器那里去。Nginx就是性能非常好的反向代理服务器用来做负载均衡。如图总结正向代理隐藏了真实的客户端。反向代理隐藏了真实的服务器。Nginx 就是一个很好的反向代理服务器当然apache也可以实现此功能。windows下Apache配置参考这篇文章 Windows Apache服务器配置NginxNginx(发音同engine x)是一个 Web服务器也可以用作反向代理负载平衡器和 HTTP缓存。该软件由 Igor Sysoev 创建并于2004年首次公开发布。同名公司成立于2011年以提供支持。我在Windows下实现Nginx负载均衡提到过Windows下Nginx命令使用。Nginx 反向代理模块 proxy_passproxy_pass 后面跟着一个 URL用来将请求反向代理到 URL 参数指定的服务器上。例如我们上面例子中的 proxy_pass https://api.shanbay.com则将匹配的请求反向代理到 https://api.shanbay.com。通过在配置文件中增加proxy_pass 你的服务器ip,例如这里的扇贝服务器地址就可以完成反向代理。server {listen 80;server_name localhost;## 用户访问 localhost则反向代理到https://api.shanbay.comlocation / {root html;index index.html index.htm;proxy_pass https://api.shanbay.com;}}配置html以文件方式打开一般的情况下我们的HTML文件时放置在Nginx服务器上面的即通过输入 http://localhost/index.html 但是在前端进行调试的时候我们可能是通过 使用 file:///E:/nginx/html/index.html 来打开HTML。服务器打开不是特别方便。而我们之所以要部署在服务器上是想要使用浏览器自带的CORS头来解决跨域问题如果不想把HTML放置在Nginx中而想通过本地打开的方式来调试HTML可以通过自己添加Access-Control-Allow-Origin等http头但是我们的AJAX请求一定要加上http://127.0.0.1/request而不能直接是 /request于是将nginx.conf作如下配置location / {root html;index index.html index.htm;# 配置html以文件方式打开if ($request_method POST) {add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Credentials true;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;}if ($request_method GET) {add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Credentials true;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;}# 代理到8080端口proxy_pass http://127.0.0.1:8080;}处理DELETE和PUT跨域请求而现在我的后台是restful风格的接口采用了delete和put方法而上面的配置就无能为力了。可以通过增加对非简单请求的判断来解决DELETE和PUT跨域请求。非简单请求是那种对服务器有特殊要求的请求比如请求方法是PUT或DELETE或者Content-Type字段的类型是application/json。非简单请求的CORS请求会在正式通信之前增加一次HTTP查询请求称为预检请求(preflight)。服务器收到预检请求以后检查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段以后确认允许跨源请求就可以做出回应。因此为了使Nginx可以处理delete等非简单请求Nginx需要作出相应的改变更改配置如下location / {# 完成浏览器的预检请求if ($request_method OPTIONS) {add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Credentials true;add_header Access-Control-Allow-Methods GET, POST, PUT, DELETE, 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;return 204;}# 配置html在本地打开if ($request_method POST) {add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Credentials true;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;}if ($request_method GET) {add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Credentials true;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;}root html;index index.html index.htm;# 配置html在Nginx中打开location ~* \.(html|htm)$ {}# 代理到8080端口proxy_pass http://127.0.0.1:8080;}我们还必须把我们的html代码放在Nginx中html文件夹内即使用Nginx当做我们的前端服务器。URL重写有时候我们仅仅只想将/api下的url反向代理到后端可以通过在nginx.conf中配置url重写规则如下location / {root html;index index.html index.htm;location ^~ /api {rewrite ^/api/(.*)$ /$1 break;proxy_pass https://api.shanbay.com/;}}这样的话我们只用处理/api下的url。在配置文件中我们通过rewrite将URL重写为真正要请求的URL通过proxy_pass代理到真实的服务器IP或者域名。Cookie如果Cookie的域名部分与当前页面的域名不匹配就无法写入。所以如果请求 www.a.com 服务器 proxy_pass 到 www.b.com 域名然后 www.b.com 输出 domianb.com 的 Cookie前端的页面依然停留在 www.a.com 上于是浏览器就无法将 Cookie 写入。可在nginx反向代理中设置location / {# 页面地址是a.com但是要用b.com的cookieproxy_cookie_domain b.com a.com; #注意别写错位置了 proxy_cookie_path / /;proxy_pass http://b.com;}总结Nginx解决跨域问题通过Nginx反向代理将对真实服务器的请求转移到本机服务器来避免浏览器的同源策略限制。参考文档