因为项目是先后端分离,API接口与Web前端 部署在不一样站点当中,所以在前文当中WebApi Ajax 跨域请求解决方法(CORS实现)使用跨域处理方式处理而不用Jsonp
的方式。html
可是在一段时间后,发现一个很奇怪的问题,每次前端发起请求的时候,经过浏览器的开发者工具都能看到在Network
下同一个url
有两条请求,第一条请求的Method
为OPTIONS
,第二条请求的Method
才是真正的Get
或者Post
,而且,第一条请求无数据返回,第二条请求才返回正常的数据。前端
第一个OPTIONS
的请求是由WEB服务器处理跨域访问引起的。OPTIONS
是一种预检请求
,浏览器在处理跨域访问的请求时,若是判断请求为复杂请求,则会先向服务器发送一条预检请求,根据服务器返回的内容,浏览器判断服务器是否容许访问该请求。若是WEB服务器采用CORS
的方式支持跨域访问,在处理复杂请求时这个预检请求是不可避免的。nginx
因为咱们的WEB服务器采用CORS
来解决跨域访问的问题,同时在header
中添加了自定义参数以及使用json
格式来进行数据交互,致使咱们的每次请求都是复杂请求,从而产生每次请求都会发送两条请求的现象。json
产生缘由以下:c#
CORS
解决跨域问题Nginx
当中,经过代理的方式来解决跨域请求问题Windows 下 安装 Nginx 最简单,直接下载压缩包,而后解压后后端
已自带默认配置,如要部署Vue
、Angular
这种单页面应用,将打包后的index.html
文件以及dist
目录放到发布目录中,将路径复制,用于配置Nginx
服务指向api
配置文件以下:跨域
server { listen 9461; # 监听端口号 server_name localhost 192.168.88.22; # 访问地址 location / { root 项目路径; # 例如:E:/Publish/xxx/; index index.html; # 此处用于处理 Vue、Angular、React 使用H5 的 History时 重写的问题 if (!-e $request_filename) { rewrite ^(.*) /index.html last; break; } } # 代理服务端接口 location /api { proxy_pass http://localhost:9460/api;# 代理接口地址 } }
Nginx
中URL重写的时候,一直报错以下if
和 (
之间必须有个空格。能够在服务端处预检完成后加入一个Access-Control-Max-Age
请求头来解决这个问题。浏览器
Access-Control-Request-Headers
字段,则Access-Control-Allow-Headers
字段是必需的。Access-Control-Allow-Methods: GET, POST, PUT Access-Control-Allow-Headers: X-Custom-Header Access-Control-Allow-Credentials: true Access-Control-Max-Age: 1728000