IIS 发布 Vue2 + Net Core Api
以下内容转载自:https://blog.csdn.net/bigbear00007/article/details/90718450
准备工作
1、部署IIS服务器
2、项目执行build生成需要部署的文件
步骤一:复制文件
把build之后的文件(dist文件夹)拷贝到IIS存放网站文件的目录
注意:
拷贝的时候不一定是要把dist整个文件夹拷贝,也可以拷贝里面的内容,这个需要看自己的需求。如果不明白的话,可以跟我一样做。
步骤二:在IIS中新建站点
在"网站"执行鼠标右键,选择添加网站。
网站名称:按照用途或者项目起名即可
应用程序池:部署前端项目,这个可以忽略,任意选择即可
内容目录:网站存放的路径,最好以英文命名
端口:web一般是80端口,不过我的80已经被其他项目占用,所以我设置为8082
步骤三:访问网站
访问网站可以在IIS界面右侧直接浏览,具体见上图,或者直接在浏览器地址栏输入:http://localhost:8082/
很多网友的文章到此应该就结束了,他们大多都显示成功截图。 but,我这边却是一个接一个坑。
下面我就给大家分享一下我的填坑之旅 ?
步骤四:填坑
坑一、报错:URL拼写错误
打开网址发现页面报错,如下图:
报错内容:
见上图显示,提示URL拼写错误。
我在路由中设置访问"/"会重定向到"/brand/company",所以上图中访问地址是正确的。
在IIS中开启代理和设置URL重写可以解决上诉问题。 具体如下
步骤一:URL重写
1、下载所需模块:urlrewrite
传送门:https://www.iis.net/downloads/microsoft/url-rewrite
2、设置规则
安装好模块之后,在IIS是图界面会看到"URL 重写"
双击之后,进入URL重写界面,在右上角点击"添加规则",具体如下图:
选择"空白规则",进入规则设置界面,具体见下图:
注意:
名称:名称按功能命名即可
匹配URL:选择使用正则表达式,然后模式根据请求的api来填写,比如我请求的api地址全都是为'/api/---',那我这里填写^((?!(api)).)*$即可
手动展开"条件"选项,添加一个"条件",选择"不是文件",具体见上图
手动展开"操作"选项,设置"重写URL"为"/index.html",然后点击右上角应用,重写URL的规则就设置好了。
步骤二:代理设置
1、下载所需模块
这里需要配置urlrewrite 和 Application Request Routing两个模块。urlrewrite 在步骤一种已经安装过了,我们需要下载application request routing,传送门:https://www.iis.net/downloads/microsoft/application-request-routing
2、开启代理
按照好application request routing模块之后再IIS功能视图界面可以看到相关设置,具体见下图:
双击进入设置界面,在右上角找到设置项目,点击进入,具体见下图:
Enable proxy 设置为"开启",在右侧点击"应用"即可,具体见下图:
3、设置urlrewrite规则
名称:根据功能命名即可
匹配URL:使用"通配符";前端请求的地址是'/api/----',所以模式设置"*api/*"
条件:不需要配置
操作:重写URL,比如我请求的实际地址是'https://blog.csdn.net/write',那我这里就填写'https://blog.csdn.net/{R:2}',具体跟实际情况填写
另外,规则数目需要根据自己请求的api地址类型数目来设置
坑二:文字乱码
经过上述配置之后,再次打开网址,已经可以正常访问了,具体见下图:
but,一坑刚平一坑又现,没有办法,开发的路上总是崎岖坎坷,兄弟你要有一颗强大的心
解决方案:
在文件夹中,选择index.html执行鼠标右键,选择打开方式为"记事本"
之后进入记事本,不需要任何编辑,执行:文件> 另存为,编码选择"UTF-8"保存即可
回到浏览器刷新页面,文本已经正常显示了
坑三:页面数据不显示
从坑二的最后一张图可以看到,页面显示空白,这是因为数据没有请求到,具体是为啥呢?
这是前面项目中请求方式埋下的坑。
在代码中改回真实的请求路劲即可
经过上述配置,vue项目真正成功的部署到IIS中了。
————————————————
版权声明:本文为CSDN博主「大雄Obear」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bigbear00007/article/details/90718450
以上内容为他人总结的方案,转载过来提供参考,下面附上我的解决方式(服务器为Windows 2016):
IIS安装URL重写,在发布文件的根路径(dist)目录下添加Web.config,省去上面所说的 设置urlrewrite规则
参照:https://router.vuejs.org/zh/guide/essentials/history-mode.html#internet-information-services-iis
<?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> </system.webServer> </configuration>
api 不需要开启 代理,省去了上面的开启代理。
.net core api 部署 可以参考这篇文章,.net core 3.1-6.0 都适合,无非是安装的包的版本不一样:https://www.cnblogs.com/riddly/p/13747989.html
遇到一个坑:
Asp.Net Core IIS发布后PUT、DELETE请求错误405.0 - Method Not Allowed 因为使用了无效方法(HTTP 谓词)
一、在使用Asp.net WebAPI 或Asp.Net Core WebAPI 时 ,如果使用了Delete请求谓词,本地生产环境正常,线上发布环境报错。
服务器返回405,请求谓词无效。
二、问题分析诊断
首先检查跨域配置是没有问题的,查询数据和新增数据的请求也是没有问题的,只出现在修改和删除数据。通过了解ABP Web API请求头设置,查询是GET请求,新增是POST请求,而修改是PUT请求,删除是DELETE请求,IIS服务通常都是支持get和post请求的,由此分析推断很有可能是IIS不支持put和delete谓词请求。
通过百度了一遍对IIS进行新添加谓词put和delete。 点击部署应用 -> 出来程序映射 –> aspNetCore(由于我部署是.Net Core 程序,所以选择AspNetCoreModule模块)
通过检查,aspNetCore本身是支持全部谓词的,现在肯定是和这个谓词有关,但需要更详细的错误信息。
既然报错信息是跨域,我们先排除跨域因数的影响,现在看到的跨域错误信息很有可能是个假象,我们通过swagger对web API进行调试。
调试需要配置授权token,请参考博客:http://www.cnblogs.com/donaldtdz/p/7892865.html
先测试接口:/api/services/app/User/GetAll
测试结果:通过 200
再测试接口:/api/services/app/User/Delete
测试结果:
HTTP 错误 405.0 - Method Not Allowed
无法显示您正在查找的页面,因为使用了无效方法(HTTP 谓词)。
将response body 用保存用浏览器打开如下:
查看详细错误信息,我们开始的推断是没有问题的,最后也尝试了很多方法,最终问题核心在于 模块WebDAVModule
三、解决方案1 (这种方式针对当前服务器所有网站,不推荐,因为可能替他网站会使用到WebDAV)
在启用或关闭Windows功能 –> Internet Information Services 关闭WebDAV发布
四、解决方案2 (针对当前网站,去除WebDav 模块)
修改当前Asp.Net Core 发布后的Web.Config
去除WebDAVModule,
<modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule" /> </modules>
修改后的Web.config如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <location path="." inheritInChildApplications="false"> <system.webServer> <modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule" /> </modules> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers>
<!--下面参照自己的程序填写 --> <aspNetCore processPath="dotnet" arguments=".\xxx.WebApi.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" /> </system.webServer> </location> </configuration> <!--ProjectGuid: B3F87C3B-1A0B-4AE8-8014-228DEB3BD444-->
解决办法:
出现这个错误是因为 IIS 7 采用了更安全的 web.config 管理机制,默认情况下会锁住配置项不允许更改。要取消锁定可以以管理员身份运行命令行 %windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers 。其中的 handlers 是错误信息中红字显示的节点名称。
如果modules也被锁定,可以运行 %windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/modules
%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/modules
注意:要以管理员身份运行才可以,默认不是管理员身份,方法,在开始菜单中的搜索程序与文件输入CMD,就会在上方出现一个CMD.EXE,在这个CMD.EXE文件上点击键,选择“以管理员身份运行”,打开命令行窗口,输入以上命令即可。
另外,如果使用Asp.net的朋友,在安装IIS7的时候一定记得勾选Asp.net,默认不选,也会出现类似的错误信息
不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况 - 落晨予曦 - 博客园 (cnblogs.com)
https://www.cnblogs.com/jxxy2012nw/p/5629225.html
关于net core 站点通过iis部署,Delete和Put请求被拦截报跨域错误的问题 - 郑小超 - 博客园 (cnblogs.com)
https://www.cnblogs.com/GreenLeaves/p/15503442.html