Rewrite

了解 IIS 8.0 使用正則表達式重寫 https 到 http 重定向的入站規則

  • June 12, 2019

我已設法使用此答案為我的網站配置重寫規則:

<rule name="Redirect from non www" stopProcessing="true">
 <match url=".*" />
 <conditions>
   <add input="{HTTP_HOST}" pattern="^example.com$" />
 </conditions>
 <action type="Redirect" url="https://www.example.com/{R:0}" redirectType="Permanent" />
</rule>

<!-- this is the rule I am interested in -->
<rule name="Redirect from non https" stopProcessing="true">
 <match url=".*" />
 <conditions>
   <add input="{HTTPS}" pattern="^OFF$" />
   <add input="{HTTP_HOST}" pattern="^www.example.com$" />
 </conditions>
 <action type="Redirect" url="https://www.example.com/{R:0}" redirectType="Permanent" />
</rule>

但是,我很難理解標籤中url的屬性實際上是如何工作的。action如果我轉到 IIS -> 重寫規則 -> 從非 https 重定向 -> 測試模式 -> 輸入 urlhttp://www.example.com/subdir/?param=value並點擊測試,我會收到{R:0}= http://www.example.com/subdir/?param=value

這是有道理的,因為*正則表達式將匹配整個字元串。

問題: URL重寫引擎如何獲取https://www.example.com/subdir/?param=value而不是https://www.example.com/http://www.example.com/subdir/?param=value

我知道這有點舊,但只是為了添加一些東西。

一種解決方案是在您的正則表達式中為規則匹配元素中的url創建額外的擷取組,以便提取 URL 的顯式部分。

反向引用 {R:0} 將始終是被測試的整個字元串,因此您可以通過添加擷取組來獲取額外的反向引用,這將提取您感興趣的子字元串。

下面是實現此目的的範例正則表達式。

這包括 2 個擷取組。 注意: 一個是非擷取組

^(?:http:)(.*)
  1. (?:http:)- 是一個非擷取組,由模式上的“?:”前綴表示,它允許匹配模式,但不包括在返回的反向引用中 - 它將僅匹配字元串“http:”。
  2. (.*)- 是一個標準的擷取組,它將返回字元串中出現在第一個非擷取組之後的所有剩餘字元 - 它將返回“http:”之後的所有內容。

生成的擷取組反向引用將是:

  1. {R:0} ::整個原始 URL
  2. {R:1} :: “http:” 之後的所有內容

因此,匹配節點中的url屬性將被修改如下:

<match url="^(?:http:)(.*)" />

並且您的操作節點中的url屬性將像這樣修改;

<action type="Redirect" url="https:{R:1}" redirectType="Permanent" />

規則中支持的正則表達式語法(根據文件)是 ECMAScript – Perl 兼容(符合 ECMAScript 標準)正則表達式語法。

更多資訊可以在 IIS 的 MS Docs 中找到:https ://docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/url-rewrite-module-configuration-reference

請注意,這是一個非常通用的解決方案,可能並不適用於所有情況 - 始終使用 IIS 的“編輯規則”螢幕中的“測試模式”功能進行測試,以確保其有效性。

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