vue反向代理解决跨域及部署nginx端口转发解决跨域

2023-11-18

1. 前言

本文是为了解决vue反向代理解决跨域及部署服务器nginx端口转发解决跨域,因为踩了不少的坑,百度了很多,也试了太多的方法,最终得以解决,所以记录一下,希望遇到同样问题的友友们可以高效的解决自己项目中遇到的问题。

2.为什么会出现跨域问题

出于浏览器的同源策略限制,同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也是最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同协议(protocol)、主机(host)和端口号(port)

3.什么是跨域

当前url请求另一个url时,协议、域名、端口号三者之间任意一个与当前url不同则视为跨域

当前url 被请求url 是否跨域 原因
http://www.test.com http://www.test.com/test.html 同源(协议、域名、端口号相同)
http://www.test.com https://www.test.com 协议不同(前http 后https)
http://www.test.com https://www.baidu.com 主域名不同(前test后baidu)
http://www.test.com https://blog.test.com 主机名不同(前www后blog)
http://www.test.com:80 https://www.test.com:8369 端口号不同(前80后8369)

4. 非同源策略限制

  • 无法读取非同源网页的Cookie、LocalStorage和IndexDB
  • 无法接触非同源的DOM
  • 无法向非同源地址发送AJAX请求

5. vue+axios请求接口本地跨域解决方案

vue开发环境下,使用反向代理解决跨域,本人使用的是vue-cli3 所以生成的项目中没有config文件,我们直接可以在项目的根目录上创建vue.config.js配置文件即可,具体实现如下


modules.exports={
	devServer:{
		proxy:{
			'/api':{
				target:"http://apis.juhe.cn/idioms/query",//后台接口地址(你想要获取数据的接口地址)
				changOrigin:true, //允许跨域
				pathRewrite:{
					'^/api':'',				// 请求时会多出来/test这个路径,但是我们不需要,通过重写去掉
												// 当我们请求/test地址时,地址会被解析为http://apis.juhe.cn/test
												// 设置pathRewrite时,地址会被解析为http://apis.juhe.cn
				}
			}
		}
	}
}

6. 反向代理生产环境解决跨域的原理

本地url http://localhost:8080
被请求url http://apis.juhe.cn
化解跨域原理图:
反向代理原理

如果直接去请求只有一个是相同的,肯定跨域
在这里将http://localhost:8080的这个域名转换为http://apis.juhe.cn,然后再将请求发送到服务器,这样在服务器端到服务器,这样在服务器端收到的请求就是使用http://apis.juhe.cn;同理,当服务器返回数据的时候,也是先到代理的中间层,将http://apis.juhe.cn转换成http://localhost:8080,这样在客户端也是在同源下访问了。

7. 将项目部署到nginx服务器

以上内容解决完成之后,我们将项目部署到nginx服务器,这时候属于生产模式了,同时我们需要在vue项目中的main.js中配置默认访问的ip,设置下面代码之后,我们就可以直接用npm run build打包,发布部署了。

import axios from "axios"
if(process.env.NODE_ENV==="production"){
	axios.defaults.baseURL = "/api"	//生产模式 不同于 开发时
}

8. 部署之后项目这时又出现跨域问题

我们需要修改nginx的配置文件,我的nginx为默认的。服务器用的系统是centos的,nginx.conf文件在这个目录下 /usr/local/nginx/conf/nginx.conf,用vim 修改,具体服务器系统是什么的按照相应操作就可,具体如下:

vim /usr/local/nginx/conf/nginx.conf	

nginx.conf内容:

server{
	listen 80;							#监听端口
	server_name localhost;				#服务器ip地址,也就是访问前端vue时路径 访问localhost:80 时就可以访问前端页面
    location / {					#访问localhost:80时,直接访问dist中的index.html页面
            root   html;				#根目录为html
            index  index.html index.htm;#默认访问的文件
        }
		location /api{						#访问服务器ip/test时,我们实际访问的是下面代理的url
				rewrite ^/api/(.*) /$1 break;		//将/test替换一下
	   	 	proxy_pass  http://apis.juhe.cn/idioms/query;	#代理设置,我们想要请求的真实接口url
		}
}

上面的内容rewire 意识是把test转为空, 比如我们访问的是/api/books 通过正则匹配就成为了books,就会变为这样
在这里插入图片描述

我的项目地址是在http://localhost下,我的后台api接口在http://apis.juhe.cn/idioms/query?请求参数下,显然如果访问就是跨域。这时候,我们通过监听80端口,设置代理当访问/api时,将转发给我的代理去访问。即实现跨域ngnix端口转发实现跨域请求。

9. 总结

vue反向代理以及部署项目到nginx解决跨域的内容讲到这里了,希望可以帮助到大家,大家如果在项目中遇到类似问题了,可以参考一下,是否和我的问题一样。文章内容,有些是摘自于互联网,整理得来的。不忘大佬们的幸苦成果。如有侵权,联系我删除即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue反向代理解决跨域及部署nginx端口转发解决跨域 的相关文章

  • nginx、Meteor 和 Docker:代理 SSL 重定向在本地主机上不起作用

    我正在尝试将 nginx 设置为 Meteor 应用程序前面的代理服务器 这些将在 Docker 容器中运行 我想做的是将每个请求重定向为对 Meteor 服务器 在端口 8080 上 的 SSL 调用 然而 当我这样做时 所发生的一切是在
  • 在一定时间后自动更改 Firestore 中的字段值 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 I m working on Javascript and here s how s my data looks like 我想要的功
  • 使用 Passport 进行 Node.js 身份验证:如果字段丢失,如何闪烁消息?

    我正在使用 Passport js 如果我的表单字段为空 我想显示一条消息 但我不知道该怎么做 因为如果缺少护照 则不会触发策略回调 我真的希望这个用例更加清晰 而且我不想修改护照 我感觉有办法 但不知道在哪里 我尝试使用路线的回调 app
  • 使用 JavaScript 查找数组中最接近的日期

    我有一个包含天数的数组 每一天都是一个对象 例如 day year 2012 day month 08 day number 03 day name mon 我还通过使用以下方法向每个日期对象添加了时间戳属性 function conver
  • 系统js语法错误,IE11

    我有一个 Angular 2 应用程序可以在 Firefox 和 Chrome 中工作 但在 IE 中却没有那么多工作 根据我的堆栈跟踪 我的 System js 设置似乎存在问题 这是我在网络控制台中看到的错误描述 Error Syste
  • JavaScript:所有标准内置对象实际上都是构造函数吗?

    我最近一直在研究 JavaScript 在花了几个月的时间之后 我仍然对一些内部结构感到困惑 具体来说 我试图理解所谓的标准内置对象 https developer mozilla org en US docs Web JavaScript
  • 将 Babel 与单个输出文件和 ES6 模块一起使用

    这是我的 gulp 任务 将 ES6 代码编译成单个 ES5 文件 我使用类和模块 import export 在 ES6 中 gulp src paths scripts pipe sourcemaps init pipe babel p
  • Vue3 中未发出生命周期钩子 beforeDestroy

    我使用 vue3 beta 18 发现当我删除 v for 中动态组件渲染的组件时 beforeDestroy 不会发出 两者都没有被停用 销毁 当我从集合 windows 中删除该组件时 该组件 消失
  • Asp.Net Core 的 Kestrel Web 服务器 - 一段时间后是否回收/重新加载

    简单的菜鸟问题 我即将使用一个小型 NET 核心应用程序主机投入生产 该主机托管在 digitalocean 的 Droplet 中 我一直使用 IIS 托管网站 但我想迁移到 Linux 发行版并使用 nginx 作为反向代理 我的问题正
  • JavaScript - babel-preset-env 不为 IE11 转换箭头函数

    我很难尝试配置 Babel 来转译 IE11 可以理解的代码 特别是箭头函数 跑步npx webpack mode development使用我的配置不会转换我的代码中的箭头函数 在eval 在生成的代码中的语句中 我可以看到所有实例都未转
  • 如何在反应路由器的登录页面中隐藏导航栏

    我想隐藏登录页面中的导航栏 我确实做到了 但我在其他页面上看不到导航栏 此代码是 My App jsx 文件的一部分 我在 App 的状态中创造了历史 当路径名是 或 login 时 我会隐藏导航栏 有用 但随后我输入了 ID 和密码 然后
  • 如何在 Electron 中使窗口大小响应。 (打开应用程序时)

    我最近开始在 Electron 上制作一个应用程序 我想让窗口具有响应能力 例如 如果我在不同的屏幕上打开应用程序 它应该根据屏幕尺寸以全尺寸打开 我的代码 app on ready gt const htmlPath path join
  • bootstrap-vue多级下拉菜单

    我正在使用 bootstrap vue 并且有一个多级下拉菜单 用于类别 这是官方网站示例 https bootstrap vue org docs components dropdown https bootstrap vue org d
  • 多个模板槽的相同槽内容

    在vuejs中 有没有一种方法可以为多个插槽设置相同的内容 而无需复制粘贴 So this
  • 我以为我了解范围

    有人可以告诉我为什么 x 的最后一次记录等于0而不是1 我想因为它是在函数之外声明的 所以它具有全局范围 然后在函数中它的值设置为1并且该值将保持原样一个全球性的 我知道函数内的第一个 x 值是全局的 因为没有 var 关键字声明的任何变量
  • 使用预先存在的数据库创建 PhoneGap iOS 应用程序

    我最近开始开发一个使用 PhoneGap 版本 2 8 0 作为药物查找器的应用程序 过去 我创建了该工具的 Web 版本 它使用 jQuery Mobile 和 PHP 来访问远程 SQL 数据库 PhoneGap 似乎是一个很有吸引力的
  • ag-Grid 中的行格式

    我们需要有条件地将行文本设置为粗体 目前它仅适用于单个单元格 但我们需要在所有列单元格上应用文本粗体 应用格式设置后 isBold 列必须隐藏 删除 此列仅用于格式化 如何应用文本缩进 10px isBold 列包含真实值的第一列的 有可能
  • getCompatedStyle 类似于 IE8 的 javascript 函数

    我正在尝试在 Java GWT 代码中编写一个 Javascript 函数 该函数获取以下样式的值 direction fontFamily fontSize fontSizeAdjust fontStyle fontWeight lett
  • 如何捕获 google 地图的无效 API 密钥

    我有这个代码 如果密钥无效 则会弹出警报 但我想在这种情况下执行一些操作 但我不知道如何连接它 有任何想法吗 Google 不提供检查 Google 地图 API 密钥的外部方法 因此 您无法使用例如查询某些服务 此代码有效吗abcde12
  • 如何将 JSLint 用于依赖于 JQuery 的代码段?

    我对 Javascript 比较陌生 我想通过 JSLint 运行我周末玩的那段代码 这样它就可以指出我在哪里是个十足的白痴 不幸的是 我收到了大量关于缺少函数声明的错误 这些函数声明是 JQuery javascript 库及其各种插件的

随机推荐

  • Error in createDataPartition(...):y must have at least 2 data points

    项目场景 在R中使用caret包 划分训练集和测试集时 出现错误Error in createDataPartition data OS STATUS p 0 5 list FALSE y must have at least 2 data
  • pytorch 多类分割损失 (Generalized Dice Loss)

    引自该文章python 常用函数和自定义函数整理 2 Pytorch相关处理 Generalized Dice Loss相关代码 如有错误 烦请指正 多类分割dice损失 def generalized dice loss pred tar
  • java Socket 简单实现客户端与服务器间通信(仿聊天室)

    java Socket TCP协议简单实现客户端与服务器间的通信 打赏 执行效果 启动服务器和3个客户端 进行群聊和私聊 执行过程 服务端 首先创建服务器套接字ServerSocket对象并绑定端口 启动服务器 然后ServerSocket
  • 电子学会 青少年软件编程(C语言)等级考试二级 训练题汇总

    一 NOI题库 1 6编程基础之一维数组 OpenJudge OpenJudge 题目 1 7编程基础之字符串 OpenJudge OpenJudge 题目 1 8编程基础之多维数组 OpenJudge OpenJudge 题目 1 9编程
  • cookie、session、token的概念以及区别

    http链接都是无状态的 即是说浏览器无法判断这一次登陆和上一次登陆有没有关联 所以引入cookie和session的概念 让http可以判断你是否曾登陆过 cookie Cookie是客户端保存用户信息的一种机制 用来记录用户的一些信息
  • 一次内核hung task分析

    http blog chinaunix net uid 14528823 id 4406510 html 1 内核hung task检测机制由来 我们知道进程等待IO时 经常处于D状态 即TASK UNINTERRUPTIBLE状态 处于这
  • python读取csv中所遇到的中文编码问题

    由于本人准备学习使用一些机器学习算法 第一个是DecisionTree 然后使用到了西瓜案例 因为涉及到讨厌的编码问题 所以找了好多办法去尝试读取csv文件 1 pandas pandas可谓是神奇 用python学习机器学习不可缺少的一个
  • 如何解决WIN10中,进入本地组策略时出现“命名空间已经被定义为存储中另一文件的目标命名空间”

    1 首先 怎么打开组策略 win R gpedit msc 回车 2 当打开组策略时出现如下的提示 当然关闭后还是可以正常使用的 只是如何去掉该提示呢 3 解决办法 引起该问题的原因就是提示的C WINDOWS PolicyDefiniti
  • Linux脚本启动jar包

    这里主要为shell脚本启动部署在服务器中jar包 bin bash 这里可替换为你自己的执行程序 其他代码无需更改 APP NAME demo jar 使用说明 用来提示输入参数 usage echo Usage sh demo sh s
  • Android上层与驱动交互完整篇(二)Hal层篇

    Android上层与驱动交互完整篇 二 Hal层篇 上篇写了I2C驱动如何来编写 但是驱动里并没有交代如何具体的跟设备通信 现在我们在hal层实现这部分逻辑代码 HAL全称Hardware Abstract Layer 硬件抽象层 它向下屏
  • 基于改进二进制粒子群算法的电力系统机组组合——复现

    目录 文章摘要 研究背景 二进制粒子群算法 代码运行效果 本文代码分享 文章摘要 提出了1种改进的BS0 二进制粒子群 方法求解机组组合问题 首先 利用优先顺序法确定初始的机组组合 根据这个结果 确定优化窗口的范围 在此范围内利用BPSO进
  • WebLogic-执行队列

    一 Tuning the Application Server 二 执行队列 Using Work Managers to Optimize Scheduled WorkThis chapter describes how WebLogic
  • K-近邻算法

    一 K 近邻算法 1 介绍 K 近邻算法 K Nearest Neighbor 又叫KNN算法 指如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别 则该样本也属于这个类别 也就是对于新输入的实例 从数据集中找到于该实例最邻
  • Ubuntu:停掉某个网络

    ifconfig 网口名 down 例子如下 ifconfig docker0 down
  • 163_omnicore升级后无法连接

    qq群里转载的 最近由于omnicore要升级 每个要升级的人都在问rpc怎么连不了了 这里统一回复下 1 为什么连不了 这是bitcoin0 18 0更改了rpcallowip自动侦听的功能 必须使用rpcbind指定要侦听的ip 2 怎
  • 约瑟夫问题详解

    约瑟夫问题 有n个人 编号为1 n 从第一个人开始报数 从1开始报 报到m的人会死掉 然后从第m 1个人开始 重复以上过程 在死了n 1个人后 问最后一个人的编号是 暴力 题目传送门 暴力都想不到就真是让人折服了 暴力的话大模拟即可 不是重
  • 列表转链表+链表合并

    列表转链表 思路 生成一个头节点 current指向该节点 再生成新节点 给该节点赋值val 更新current位置 依次类推 class ListNode object def int self val 0 next None self
  • 腾讯28-整数反转

    腾讯28 整数反转leetcode7 给出一个 32 位的有符号整数 你需要将这个整数中每位上的数字进行反转 示例 1 输入 123 输出 321 示例 2 输入 123 输出 321 示例 3 输入 120 输出 21 注意 假设我们的环
  • mac xmind

    1 首先要安装包 XMind For Mac 本人下载的这个版本xmind8update9 2 下载破解包 XMindCrack jar 链接 https pan baidu com s 1jqpodMvKQTNQyenAIy0Y3w 密码
  • vue反向代理解决跨域及部署nginx端口转发解决跨域

    1 前言 本文是为了解决vue反向代理解决跨域及部署服务器nginx端口转发解决跨域 因为踩了不少的坑 百度了很多 也试了太多的方法 最终得以解决 所以记录一下 希望遇到同样问题的友友们可以高效的解决自己项目中遇到的问题 2 为什么会出现跨