问题一:IIS配置导致页面刷新时找不到文件或目录
错误配置
IIS配置web.config如下
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="test" patternSyntax="Wildcard">
<match url="*api/*" />
<action type="Rewrite" url="http://10.10.17.74:8085/{R:2}" />
</rule>
</rules>
</rewrite>
<staticContent>
<mimeMap fileExtension=".glb" mimeType="application/glb" />
<clientCache cacheControlMode="DisableCache" cacheControlMaxAge="3.00:00:00" />
</staticContent>
</system.webServer>
</configuration>
问题现象
刷新页面时提示404找不到文件或目录。
正确配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="index">
<match url="^((?!(api)).)*$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="/index.html" />
</rule>
<rule name="test" patternSyntax="Wildcard">
<match url="*api/*" />
<action type="Rewrite" url="http://10.10.17.74:8085/{R:2}" />
</rule>
</rules>
</rewrite>
<staticContent>
<mimeMap fileExtension=".glb" mimeType="application/glb" />
<clientCache cacheControlMode="DisableCache" cacheControlMaxAge="3.00:00:00" />
</staticContent>
</system.webServer>
</configuration>
说明:
1、刷新找不到文件或目录因为没有配置<rule name="index">
2、mimeMap部分是添加媒体类型后自动追加的
问题二:POST调用后台请求时报错405
现象截图如下
错误配置如下
IIS配置web.config如下
<rule name="index">
<match url="^((?!(api)).)*$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="/index.html" />
</rule>
<rule name="dl" patternSyntax="Wildcard">
<match url="*dl/*" />
<action type="Rewrite" url="http://10.10.17.74:9100/{R:2}" />
</rule>
说明
- 1、配置文件中第一个规则,将所有不包含api的请求捕获,相当于路由去跳转。
- 2、配置文件中第二个规则,将所有包含dl的请求重定向到后台。
- 3、然而我现在调用接口/dl/uaa/loginUser,那到底被哪个规则匹配上呢,于是就出问题了。
- 4、所以需要在调用后台接口时,所有接口前面都拼上相同的匹配字符串(如api)即可,参考正确配置。
正确配置
<rule name="index">
<match url="^((?!(api)).)*$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="/index.html" />
</rule>
<rule name="dl" patternSyntax="Wildcard">
<match url="*api/dl/*" />
<action type="Rewrite" url="http://10.10.17.74:9100/{R:2}" />
</rule>
其他
通常习惯性使用配置文件直接改写配置,其实IIS提供界面操作,还可以测试配置的规则是否正确。简要记录一下:
1、点击【URL重写】
2、即可查看当前网站的URL规则,可添加、修改。
3、双击已添加的规则,点击测试模式,输入要测试的url,点击测试后会出现结果,可用于校对重写URL和捕获的是否一致。
问题三:添加网站
右键-添加网站,其实没什么问题,就记录一下。
问题四:添加媒体类型
本地能看到.glb/.gltf的模型文件,但是放到IIS服务器上就看不到了。
因为需要配置MIME类型:
然后查看web.config文件发现:
<staticContent>
<mimeMap fileExtension=".glb" mimeType="application/glb" />
<mimeMap fileExtension=".gltf" mimeType="application/gltf" />
<clientCache cacheControlMode="DisableCache" cacheControlMaxAge="3.00:00:00" />
</staticContent>
OK了。
问题五:配置ws代理和视频调用
原始配置如下:(错误配置)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="index">
<match url="^((?!(api)|(wsProxy)).)*$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="/index.html" />
</rule>
<rule name="api" patternSyntax="Wildcard">
<match url="*api/*" />
<action type="Rewrite" url="http://后台服务IP:PORT/{R:2}" />
</rule>
<rule name="videoapi" patternSyntax="Wildcard">
<match url="*videoapi/*" />
<action type="Rewrite" url="http://后台服务IP:PORT/videoapi/{R:2}" />
</rule>
<rule name="wsProxy" patternSyntax="Wildcard">
<match url="*wsProxy/*" />
<action type="Rewrite" url="http://后台服务IP:PORT/{R:2}" />
</rule>
</rules>
</rewrite>
<staticContent>
<mimeMap fileExtension=".glb" mimeType="application/glb" />
<mimeMap fileExtension=".gltf" mimeType="application/gltf" />
<clientCache cacheControlMode="DisableCache" cacheControlMaxAge="3.00:00:00" />
</staticContent>
</system.webServer>
</configuration>
当请求路径为
http://前端IP:PORT/videoapi/后台接口
请求不会匹配到index,接下来匹配到api,就转发到api对应的地址了。
此时尽管把videoapi移到api前面也不行。
<rule name="videoapi" patternSyntax="Wildcard">
<match url="*videoapi/*" />
<action type="Rewrite" url="http://后台服务IP:PORT/videoapi/{R:2}" />
</rule>
<rule name="api" patternSyntax="Wildcard">
<match url="*api/*" />
<action type="Rewrite" url="http://后台服务IP:PORT/{R:2}" />
</rule>
正确配置方法有二:
一、修改代码,替换vedioapi的拦截方式
二、在rule上添加stopProcessing="true"
官方说明: docs.microsoft.com/zh-cn/excha…
正确配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="index" stopProcessing="true">
<match url="^((?!(api)|(wsProxy)).)*$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="/index.html" />
</rule>
<rule name="videoapi" patternSyntax="Wildcard" stopProcessing="true">
<match url="*videoapi/*" />
<action type="Rewrite" url="http://后台服务IP:PORT/videoapi/{R:2}" />
</rule>
<rule name="api" patternSyntax="Wildcard" stopProcessing="true">
<match url="*api/*" />
<action type="Rewrite" url="http://后台服务IP:PORT/{R:2}" />
</rule>
<rule name="wsProxy" patternSyntax="Wildcard"
stopProcessing="true">
<match url="*wsProxy/*" />
<action type="Rewrite" url="http://后台服务IP:PORT/{R:2}" />
</rule>
</rules>
</rewrite>
<staticContent>
<mimeMap fileExtension=".glb" mimeType="application/glb" />
<mimeMap fileExtension=".gltf" mimeType="application/gltf" />
<clientCache cacheControlMode="DisableCache" cacheControlMaxAge="3.00:00:00" />
</staticContent>
</system.webServer>
</configuration>
注意:
videoapi的配置要在api前面,当匹配videoapi成功后不执行后续的匹配规则。