了解 IIS 8.0 使用正则表达式重写 https 到 http 重定向的入站规则

了解 IIS 8.0 使用正则表达式重写 https 到 http 重定向的入站规则

我已经设法使用为我的网站配置了重写规则这个答案

<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

答案1

我知道这有点老了,但只是想添加一些内容。

一个解决方案是在正则表达式中为网址在里面match 元素规则,以提取 URL 的明确部分。

反向引用 {R:0} 始终是被测试的整个字符串,因此您可以通过添加捕获组来获取额外的反向引用,从而提取您感兴趣的子字符串。

下面是实现此目的的正则表达式的示例。

它由 2 个捕获组组成。 笔记: 一个是非捕获组

^(?:http:)(.*)
  1. (?:http:)- 是一个非捕获组,用模式上的“?:”前缀表示,允许匹配模式,但不将其包含在返回的反向引用中 - 它只会匹配字符串“http:”。

  2. (.*)- 是一个标准的捕获组,它将返回第一个非捕获组之后出现的字符串中的所有剩余字符 - 它将返回“http:”之后的所有内容。

最终的捕获组反向引用将是:

  1. {回复:0}::完整原始 URL
  2. {回复:1}::“http:” 之后的所有内容

所以网址属性在你的匹配节点将被修改如下:

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

还有网址属性在你的行动节点将被修改如下;

<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 的编辑规则屏幕中的测试模式功能进行测试以确保其有效性。

相关内容