我有一个 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>