小编给大家分享一下Nginx怎么解决WebApi跨域二次请求以及Vue单页面的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
<强>一、前言强>
由于项目是前后端分离,API接口与Web前端部署在不同站点当中,因此在前文当中WebApi Ajax跨域请求解决方法(歌珥实现)使用跨域处理方式处理而不用Jsonp的方式。
但是在一段时间后,发现一个很奇怪的问题,每次前端发起请求的时候,通过浏览器的开发者工具都能看到在网络下同一个url有两条请求,第一条请求的方法为选择,第二条请求才的方法是真正的获得或者,并且,第一条请求无数据返回,第二条请求才返回正常的数据。
<强>二,原因强>
第一个选项的请求是由Web服务器处理跨域访问引发的.OPTIONS是一种预检请求,浏览器在处理跨域访问的请求时,如果判断请求为复杂请求,则会先向服务器发送一条预检请求,根据服务器返回的内容,浏览器判断服务器是否允许访问该请求。如果Web服务器采用歌珥的方式支持跨域访问,在处理复杂请求时这个预检请求是不可避免的。
由于我们的Web服务器采用歌珥来解决跨域访问的问题,同时在标题中添加了自定义参数以及使用json格式来进行数据交互,导致我们的每次请求都是复杂请求,从而产生每次请求都会发送两条请求的现象。
<强>产生原因如下:强>
使用歌珥解决跨域问题
<强>三,解决方案强>
<强> 3.1 Nginx 强>
<强> 3.1.1思路强>
将前端项目部署在Nginx当中,通过代理的方式来解决跨域请求问题
<强> 3.1.2实现强>
<强> 3.1.2.1安装Nginx 强>
Windows下安装Nginx最简单,直接下载压缩包,然后解压后
<强> 3.1.2.2配置Nginx 强>
已自带默认配置,如要部署Vue,角这种单页面应用,将打包后的指数。html文件以及dist目录放到发布目录中,将路径复制,用于配置Nginx服务指向
配置文件如下:
server { ,listen 9461; #,监听端口号 ,server_name localhost 192.168.88.22; #,访问地址 ,位置/,{ ,root 项目路径;,#,例如:E:/发布/xxx/; ,index index . html; , ,#此处用于处理,Vue,角,React 使用H5 的,历史时,重写的问题 ,if (! -e request_filename美元),{ ,rewrite ^ (. *),/index.html 去年; ,打破; ,} ,} , ,#代理服务端接口 ,位置/api { ,proxy_pass http://localhost: 9460/api; #,代理接口地址 ,} ,}
<强> 3.1.2.3 Nginx常用命令强>
启动:开始Nginx
重新加载配置:Nginx - s重载
重新打开日志文件:Nginx - s重开
测试配置文件是否正确:Nginx - t(可选:指定路径)
快速停止:Nginx - s停止
有序停止:Nginx - s退出
<强> 3.1.3 Nginx单页面应用H5历史Url重写强>
<强>支持强>
Vue,角,反应
<强>原因强>
实现单页面时,刷新页面会产生页面找不到的问题,所以需要重写Url地址到索引。当html中。
<强>注意点强>
在使用Nginx中URL重写的时候,一直报错如下
检查后,发现如果和(之间必须有个空格。
<强> 3.2其他强>
<强> 3.2.1思路强>
既然要发送预检请求,是否可以减少预检请求的次数?
例如可以设定一个有效期,在有效期内不再重复预检。
<强> 3.2.2实现强>
可以在服务端处预检完成后加入一个Access-Control-Max-Age请求头来解决这个问题。
<强> 3.2.3歌珥响应字段说明强>
Access-Control-Allow-Methods
该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法。
注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次“预检“请求。
Access-Control-Allow-Headers
如果浏览器请求包括Access-Control-Request-Headers字段,则Access-Control-Allow-Headers字段是必需的。
它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在“预检“中请求的字段。
Access-Control-Allow-Credentials
该字段与简单请求时的含义相同。