具有反向代理和静态的 Microsoft IIS 规则

具有反向代理和静态的 Microsoft IIS 规则

我有一个 IIS 服务器,它最初在 wwwroot 中托管静态 HTML,但后来我们决定,如果百度蜘蛛尝试抓取,我们将把流量映射到在 IIS 服务器旁边运行的 NuxtJS Web 服务器。

因此我们安装了 ARR(应用程序请求路由)启用反向代理,它工作正常,现在我们首先尝试测试 URL 重写入站规则中的位置:

  • 如果百度蜘蛛将请求映射到 NuxtJS 服务器 (http://localhost:3000) (这首先用于测试)

因此,我们预计,如果普通用户请求,它将提供 wwwroot 中的静态 HTML,因为它没有达到规则,而是得到了 500。

做记录:

  • 我正在使用 Windows 2012 和 IIS 版本 8.5
  • 如果我禁用入站规则,那么它肯定会提供静态 HTML 文件

那么我需要创建另一条规则吗?我原本以为,如果它没有满足任何规则,它将发生默认行为,即只读取 wwwroot

更新

  • 我决定为我的静态 HTML 服务创建另一条规则。下面是 IIS 生成的重写规则。我现在的问题是第二条规则不起作用。当我禁用第一条规则时,第二条规则就会起作用
<?xml version="1.0" encoding="UTF-8"?>
<rules>
    <clear />
    <rule name="ReverseProxyInboundRule1" enabled="true" stopProcessing="false">
        <match url="(.*)" />
        <action type="Rewrite" url="http://localhost:3000/{R:1}" />
        <conditions>
            <add input="{HTTP_USER_AGENT}" pattern="^((?Baidu).)*$" />
        </conditions>
    </rule>
    <rule name="StaticHTMLForBaiduCrawler" enabled="true" stopProcessing="false">
        <match url="(.*)" />
        <conditions>
            <add input="{HTTP_USER_AGENT}" pattern="^((?!Baidu).)*$" />
        </conditions>
        <action type="Rewrite" url="{R:1}/index.html" />
    </rule>
</rules>

答案1

第一条规则中条件中的正则表达式不是 IIS 的有效正则表达式。如果您希望在用户代理包含百度时执行第一条规则,而在不包含百度时执行第二条规则,那么您可以执行如下操作。请注意第二条规则中条件中的否定:

<?xml version="1.0" encoding="UTF-8"?>
<rules>
    <clear />
    <rule name="ReverseProxyInboundRule1" enabled="true" stopProcessing="false">
        <match url="(.*)" />
        <action type="Rewrite" url="http://localhost:3000/{R:1}" />
        <conditions>
            <add input="{HTTP_USER_AGENT}" pattern="Baidu" />
        </conditions>
    </rule>
    <rule name="StaticHTMLForBaiduCrawler" enabled="true" stopProcessing="false">
        <match url="(.*)" />
        <conditions>
            <add input="{HTTP_USER_AGENT}" pattern="Baidu" negate="true" />
        </conditions>
        <action type="Rewrite" url="{R:1}/index.html" />
    </rule>
</rules>

相关内容