Iis

具有反向代理和靜態的 Microsoft IIS 規則

  • July 24, 2020

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

第一條規則中條件中的正則表達式不是 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>

引用自:https://serverfault.com/questions/1026516