我已经设法使用为我的网站配置了重写规则这个答案:
<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:)(.*)
(?:http:)
- 是一个非捕获组,用模式上的“?:”前缀表示,允许匹配模式,但不将其包含在返回的反向引用中 - 它只会匹配字符串“http:”。(.*)
- 是一个标准的捕获组,它将返回第一个非捕获组之后出现的字符串中的所有剩余字符 - 它将返回“http:”之后的所有内容。
最终的捕获组反向引用将是:
- {回复:0}::完整原始 URL
- {回复: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 的编辑规则屏幕中的测试模式功能进行测试以确保其有效性。