Nginx 解决WebApi跨域二次请求以及Vue单页面的问题
作者:简玄冰 发布时间:2023-10-13 23:43:06
一、前言
由于项目是前后端分离,API接口与Web前端 部署在不同站点当中,因此在前文当中WebApi Ajax 跨域请求解决方法(CORS实现)使用跨域处理方式处理而不用Jsonp的方式。
但是在一段时间后,发现一个很奇怪的问题,每次前端发起请求的时候,通过浏览器的开发者工具都能看到在Network下同一个url有两条请求,第一条请求的Method为OPTIONS,第二条请求的Method才是真正的Get或者Post,并且,第一条请求无数据返回,第二条请求才返回正常的数据。
二、原因
第一个OPTIONS的请求是由WEB服务器处理跨域访问引发的。OPTIONS是一种预检请求,浏览器在处理跨域访问的请求时,如果判断请求为复杂请求,则会先向服务器发送一条预检请求,根据服务器返回的内容,浏览器判断服务器是否允许访问该请求。如果WEB服务器采用CORS的方式支持跨域访问,在处理复杂请求时这个预检请求是不可避免的。
由于我们的WEB服务器采用CORS来解决跨域访问的问题,同时在header中添加了自定义参数以及使用json格式来进行数据交互,导致我们的每次请求都是复杂请求,从而产生每次请求都会发送两条请求的现象。
产生原因如下:
使用CORS解决跨域问题
三、解决方案
3.1 Nginx
3.1.1 思路
将前端项目部署在Nginx当中,通过代理的方式来解决跨域请求问题
3.1.2 实现
3.1.2.1 安装 Nginx
Windows 下 安装 Nginx 最简单,直接下载压缩包,然后解压后
3.1.2.2 配置 Nginx
已自带默认配置,如要部署Vue、Angular这种单页面应用,将打包后的index.html文件以及dist目录放到发布目录中,将路径复制,用于配置Nginx服务指向
配置文件如下:
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;# 代理接口地址
}
}
3.1.2.3 Nginx 常用命令
启动:start nginx
重新加载配置:nginx -s reload
重新打开日志文件:nginx -s reopen
测试配置文件是否正确:nginx -t [可选:指定路径]
快速停止:nginx -s stop
有序停止:nginx -s quit
3.1.3 Nginx 单页面应用H5 History Url重写
支持
Vue、Angular、React
原因
实现单页面时,刷新页面会产生页面找不到的问题,所以需要重写Url地址到index.html当中。
注意点
在使用Nginx中URL重写的时候,一直报错如下
检查后,发现 if 和 ( 之间必须有个空格。
3.2 Other
3.2.1 思路
既然要发送预检请求,是否可以减少预检请求的次数?
例如可以设定一个有效期,在有效期内不再重复预检。
3.2.2 实现
可以在服务端处预检完成后加入一个Access-Control-Max-Age请求头来解决这个问题。
3.2.3 CORS 响应字段说明
Access-Control-Allow-Methods
该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法。
注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次"预检"请求。
Access-Control-Allow-Headers
如果浏览器请求包括Access-Control-Request-Headers字段,则Access-Control-Allow-Headers字段是必需的。
它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段。
Access-Control-Allow-Credentials
该字段与简单请求时的含义相同。
Access-Control-Max-Age
该字段可选,用来指定本次预检请求的有效期,单位为秒。上面结果中,有效期是20天(1728000秒),即允许缓存该条回应1728000秒(即20天),在此期间,不用发出另一条预检请求。
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: X-Custom-Header
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 1728000
来源:https://www.cnblogs.com/jianxuanbing/p/8252252.html
猜你喜欢
- # DedeCMS v5.3 归档插件+列表生成控制# jim.ma QQ:164186 jim.mail ~@~ 163.com程序中部分
- 今天突然发现自己买了一年快过期了的搬瓦工,除了少数时间拿来当梯子用用其它也没用上,所以流量还剩这么多。。。所以就想试试把本地写的nodejs
- 对于很多WordPress新手来说,不懂任何代码的情况下去瞎改WordPress主题,得出的效果往往会出现语法错误之类的东西或效果不尽人意。
- 前几天Centos8发布了,尽管他是8的第一个版本,那么今天我们就在VM12上面安装centOS8吧,8这个图形化界面我个人感觉有点丑&nb
- 1、做友情链接要有的放矢。不能够乱撒网!做友情链接就要做和我们自己网站内容相关的网站的链接!这就和国家确定自己的外交政策一样,和自己国家的政
- CentOS下RabbitMq高可用集群环境搭建教程分享给大家。准备工作1、准备两台或多台安装有rabbitmq-server服务的服务器我
- 为了更好的实现对社区热点信息的聚焦,Discuz! 7.1新增了“主题热度与主题评价”功能,成为强化社区信息聚焦重要应用手段。重视细节改进是
- Tcp_Wrappers是一个用来分析TCP/IP封包的软件,类似的IP封包软件还有iptables,linux默认都安装了此软件,作为一个
- 虚拟服务器是有很多好处,但它的安全问题完全暴露了吗?如何确保安全性?可以采用下面十个积极步骤。去年,数据中心虚拟化方面的重大问题还是“该技术
- 通常利用Apache的rewrite模块对 URL 进行重写的时候, rewrite规则会写在 .htaccess 文件里。但要使
- 据瑞星全球反病毒监测网介绍,今日有一个病毒特别值得注意,它是:VB木马点击器变种ZWZ“(Trojan.Clicker.Win32.VB.z
- 很显然,微软的放手并没有影响雅虎自己的计划。有消息称,雅虎将在本周中宣布与Google结成合作伙伴关系,在其搜索结果旁边放置Google提供
- 为什么我的Free Ad-Supported托管网站不能正常显示呢? 如果你的HTML代码使用的是绝对位置,你的网站将显示在广告幅的右边或者
- 万众瞩目的Windows 7操作系统终于正式发布了,喜欢尝鲜的朋友想必已经开始在更新自己电脑的操作系统了吧!可只是安装好操作系统可不行,还得
- 越来越多的网站和博客开始投放Google AdSense广告,随之而来的是每个发布者的喜悦和烦恼。“今天的广告费又多了”,“单价竟然上涨了0
- 什么是404错误HTTP 404 错误意味着链接指向的网页不存在,即原始网页的URL失效,这种情况经常会发生,很难避免,比如说:网页URL生
- ServU plus2.0ServU plus2.0是Serv-U的一个插件,其主要功能就是捕捉Serv-U的事件,然后做适当的功能增强、扩
- 为了优化网站的访问速度,我们可以通过对静态内容进行压缩,从而减少网页加载的时间,大大节省用户的带宽。在这篇文章中,我将介绍如何使用Apach
- 功能:把指定的输入文件拷贝到指定的输出文件中,并且在拷贝过程中可以进行格式转换。可以用该命令实现DOS下的 diskcopy命令的作用。先用
- 监控硬件运行状况shell 监控cpu,memory,load average,记录到log,当负载压力时,发电邮通知管理员。原理:1.获取