IIS服务器 部署前端的各种问题

1,730 阅读1分钟

问题一: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成功后不执行后续的匹配规则。