vue 部署到本机IIS 部署 SPA 应用

news2024/11/29 10:37:44

  安装

URL Rewrite

Works With: IIS 7, IIS 7.5, IIS 8, IIS 8.5, IIS 10

URL Rewrite : The Official Microsoft IIS Site

目前公司的 Web 项目是 SPA 应用,采用前后端分离开发,所以有时也会倒腾 Vue 框架。

在 Devops 实践中,容器部署成为良方和事实标准。

但是在开发和自测阶段,不要滥打镜像,前后端团队还需要一个友好的联调+自测的验证环境,最友好、最顺手的 web 服务器当属 IIS,(后端 API 已经使用 WebDeploy 部署到 IIS),本文记录使用 IIS 托管 Vue 应用的姿势。

前置条件:安装IIS、Url Rewrite Module !!!

1. 部署Vue应用

我们以Github上Vue Todo应用为例,执行 yarn build

图片

如果 build 成功,你会发现生成了一个 dist 静态资源文件夹。

2. 创建web.config

将 yarn 生成的 dist 文件夹拷贝到 C:\dist,并添加以下 web.config 文件, 这个文件实际是我们在 IIS Url-Rewrite module 上配置的结果。

<?xml version="1.0" encoding="utf-8"?><configuration><system.webServer><rewrite><rules><rule name="Handle History Mode and custom 404/500" stopProcessing="true"><match url="(.*)" /><conditions logicalGrouping="MatchAll"><add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /><add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /></conditions><action type="Rewrite" url="/" /></rule></rules></rewrite><httpErrors><remove statusCode="404" subStatusCode="-1" /><remove statusCode="500" subStatusCode="-1" /><error statusCode="404" path="/survey/notfound" responseMode="ExecuteURL" /><error statusCode="500" path="/survey/error" responseMode="ExecuteURL" /></httpErrors><modules runAllManagedModulesForAllRequests="true"/></system.webServer></configuration>

3. 在IIS上部署Vue应用

图片

点击确定

4.运行Vue应用

图片

Nice!现在你的 Vue 静态应用就运行在IIS上。

But, 在前后端分离模式中,我们的 Vue 应用不仅有静态资源,还要发起动态 api 请求。

一般情况下webpack打包后的api请求路径是/, 会尝试请求同域名下api资源, 实际并不存在。

我们需要将对 Vue 应用的 api 请求代理到真实后端地址。

5. 反向代理动态api请求

Vue 应用站点还要充当一部分反向代理服务器的作用。

图片

假设真实后端 api 地址部署在10.200.200.157:8091地址上,api 请求以 /api 为前缀。

下面利用Url Rewrite Module 反向代理api请求到真实后端:

   点击站点功能视图---> Url重写---> 添加入站规则

图片

Url重写的结果其实就是下面的web.config文件

<?xml version="1.0" encoding="utf-8"?><configuration><!-- To customize the asp.net core module uncomment and edit the following section.   For more info see https://go.microsoft.com/fwlink/?linkid=838655 --><system.webServer><rewrite> <rules> <clear /> <rule name="ReverseProxyInboundRule" stopProcessing="true"> <match url="api/([_0-9a-z/-]+)" /><conditions logicalGrouping="MatchAll" trackAllCaptures="false" /><action type="Rewrite" url="http://10.200.200.157:8091/{R:0}" /> </rule> <rule name="ResourceToIndex" stopProcessing="true"><match url="(.*)" /><conditions logicalGrouping="MatchAll" trackAllCaptures="false"><add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /><add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /></conditions><action type="Rewrite" url="/" /></rule></rules></rewrite><httpErrors><remove statusCode="404" subStatusCode="-1" /><remove statusCode="500" subStatusCode="-1" /><error statusCode="404" path="/survey/notfound" responseMode="ExecuteURL" /><error statusCode="500" path="/survey/error" responseMode="ExecuteURL" /></httpErrors> </system.webServer></configuration><!--ProjectGuid: 068855e8-9240-4f1a-910b-cf825794513b-->

注意:黄色背景行便是反向代理规则 ReverseProxyInboundRule, 注意反向代理规则要在静态资源规则 ResourceToIndex 的前面。

这样我们就完成了在前后端分离开发模式下,使用 IIS 托管 Vue 应用的全过程。  

参考:

IIS常见错误

Internet 信息服务 (IIS) 网页上的 HTTP 错误 500.19 - Internet Information Services | Microsoft Learn

在 IIS 中部署 SPA 应用,多么痛的领悟!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/991989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++11新特性④ | 模板类std::function和标准库函数std::bind

目录 1、引言 2、std::function函数模板类 3、std::bind标准库函数 4、std::bind和std::function配合使用 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/article/details/12427258…

Kafka集群与消息可靠性

Kafka集群搭建实战 使用两台Linux服务器&#xff1a;一台192.68.10.7 一台192.168.10.8 192.68.10.7 的配置信息修改 192.168.10.8的配置信息修改 Kafka集群原理 成员关系与控制器 控制器其实就是一个broker, 只不过它除了具有一般 broker的功能之外, 还负责分区首领的选举…

如何优化网站SEO(提高排名和流量的3个小知识)

百度百科SEO简介&#xff1a;搜索引擎优化&#xff08;SearchEngineOptimization&#xff09;是指通过对网站内部结构、外部链接以及页面内容等进行调整&#xff0c;从而使其在搜索引擎中排名更靠前&#xff0c;从而带来更多的流量和曝光。SEO是数字营销中的重要一环&#xff0…

【web开发】4、JavaScript与jQuery

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、JavaScript与jQuery二、JavaScript常用的基本功能1.插入位置2.注释3.变量4.数组5.滚动字符 三、jQuery常用的基本功能1.引入jQuery2.寻找标签3.val、text、appe…

Yolov8魔术师:卷积变体大作战,涨点创新对比实验,提供CVPR2023、ICCV2023等改进方案

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文独家改进&#xff1a;提供各种卷积变体DCNV3、DCNV2、ODConv、SCConv、PConv、DynamicSnakeConvolution、DAT&#xff0c;引入CVPR2023、ICCV2023等改进方案&#xff0c;为Yolov8创新保驾护航&#xff0c;提供各种科研对比实验 &am…

js如何实现字符串反转?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 split() 和 reverse() 方法⭐ 使用循环⭐ 使用递归⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专…

数控程序传输DNC服务、数控刀补服务(发那科fanuc、西门子、三菱、广数、新代、华中、宝元、马扎克、大畏Okuma)等数据采集服务

行业现状&#xff1a; 最近听到很多做MES、ERP这一行的叫苦&#xff0c; 客户对项目的要求越来越严格&#xff0c;做到数字化工厂都伴随着ERP、MES的项目要求必须一起做下去 然而很对MES、ERP对设备协议不懂&#xff0c;买了协议自己还要开发&#xff0c;考虑线程的问题、断…

C++多线程编程(第三章 案例2,条件变量,生产者-消费者模型)

目录 1、condition_variable1.1、生产者消费者模型1.2、改变共享变量的线程步骤1.3、等待信号读取共享变量的线程步骤1.3.1、获得改变共享变量线程共同的mutex1.3.2、wait()等待信号通知1.3.2.1、无lambda表达式1.3.2.2 lambda表达式 样例代码 1、condition_variable 等待中&a…

数据平滑和离群值检测

目录 移动窗口方法 常见的平滑方法 检测离群值 非均匀数据 数据平滑指用于消除数据中不需要的噪声或行为的技术&#xff0c;而离群值检测用于标识与其余数据显著不同的数据点。 移动窗口方法 移动窗口方法是分批处理数据的方式&#xff0c;通常是为了从统计角度表示数据中…

Union-Find Algorithm-并查集

目录 1.概念 2.并查集的优化 1.路径压缩&#xff08;Path Compression&#xff09; 1&#xff09;隔代压缩&#xff1a; 2&#xff09;完全压缩&#xff1a; 2.按秩合并 1.概念 并查集&#xff1a;用于判断一对元素是否相连&#xff0c;它们的关系是动态添加&#xff08…

嵌入式学习笔记(20) SoC时钟系统简介

什么是时钟&#xff0c;SoC为什么需要时钟 &#xff08;1&#xff09;时钟同步工作系统的同步节拍 &#xff08;2&#xff09;SoC内部有很多器件&#xff0c;譬如CPU、DRAM控制器、串口、GPIO等内部外设&#xff0c;这些东西要彼此协调工作&#xff0c;需要一个同步的时钟系统…

解决css设置图片大小不生效的问题

今天在做css布局时发现一个问题&#xff1a;设置图片大小不生效&#xff1a; 如上图所示&#xff1a;左上角两个图标的大小不一致&#xff0c;第一个是56x56,第二个是49x49,所以要把第二个的高度设置成56px&#xff1a; .mi-home img {height: 56px; }但是如上代码&#xff0c;…

Java-钉钉订阅事件

文章目录 背景什么是钉钉订阅事件钉钉订阅事件的应用场景 整体思路查看钉钉文档 什么是钉钉回调钉钉回调具体实操创建自己的应用钉钉回调开发过程中遇到的问题 总结 背景 最近需要做一个业务&#xff1a;钉钉组织架构下添加人员之后&#xff0c;要对该人员的数据信息做一个处理…

mysql课堂笔记 mac

目录 启动mac上的mysql 进入mysql mac windows 创建数据库 创建表 修改字段数据类型 修改字段名 增加字段 删除字段 启动mac上的mysql sudo /usr/local/mysql/support-files/mysql.server start 直接输入你的开机密码即可。 编辑 进入mysql mac sudo /usr/local…

Revit SDK 介绍:MeasurePanelArea 统计分割表面中族的面积

前言 这个例子介绍如果从分割表面中&#xff0c;获取内部Tile&#xff08;或者Panel&#xff09;的族里面的几何实体的面的面积。 内容 本例子的逻辑相对来说比较简单&#xff0c;主要是对 DividedSurface 和 Element 的API接口要熟悉。 核心逻辑 设置单个面板Panel的面积上…

交友盲盒完整版——详细源码分享

现在目前比较火热的一款app交友盲盒是通过uniappspringboot技术来制作的&#xff0c;原理其实很简单&#xff0c;大家一看便知。 大家自行下载到手机里面去使用即可&#xff0c;不支持ios手机 演示地址&#xff1a;https://share.weiyun.com/l3ovztce 下面就是给大家分享源码了…

用Maloja创建音乐收听统计数据

什么是 Maloja &#xff1f; Maloja 是简单的自托管音乐记录数据库&#xff0c;用于创建个人收听统计数据。没有推荐&#xff0c;没有社交网络&#xff0c;没有废话。Maloja 是一个跟踪您一段时间内的收听习惯的工具。 官方演示站点&#xff1a;https://maloja.krateng.ch/ 导出…

一路风景一路歌 森海塞尔MKE 200为你记录City Walk的美妙旋律

“想要切身融入并感受一个地方的生活&#xff0c;不去当地街头溜达溜达怎么行&#xff1f;”一位City Walk Vlogger这样说。 City Walk可谓是时下最潮的生活方式之一了。不仅越来越多的游客开始穿梭于城市街巷&#xff0c;探寻饱含记忆的老建筑、老街区&#xff0c;从另一种角度…

Smallest number(dfs全排列)

Smallest number - 洛谷 #include<bits/stdc.h> #define int long long using namespace std; int a[10]; string s[5]; bool vis[10]; int ans1e13;//0x3f1e9&#xff0c;所有有点不够 void dfs(int u) { // for(int i0;i<4;i) // { // printf("%d…

Arouter配置指南

Arouter实现了大型App之间的轻耦合&#xff0c;降低代码的复杂度&#xff0c;易维护。如果不使用Arouter那么项目之前的关系可能是如下&#xff1a;底层模块间相互耦合&#xff0c;工程代码复杂度高&#xff0c;不便于管理。 Arouter 引入Arouter后希望底层模块间轻耦合&…