IIS 中Rewrite http/https (URL Rewrite – Protocol (http/https))

简介IIS URL Rewrite几乎支持URL和HTTP头的每个部分的服务器变量。但是,协议是个例外HTTP或HTTPS,总结一些变通方法。

参考地址:https://blogs.iis.net/owscott/url-rewrite-protocol-http-https-in-the-action

以下是机器翻译译文记录

您可以轻松地检查页面请求是否使用 HTTP 或 HTTPS,但仅在规则的条件部分有效。没有可动态设置规则操作部分的协议的变量。我希望有一个变量,如[HTTP_PROTOCOL],这将具有"HTTP"或"HTTPS"的价值。有一个名为 [HTTPS] 的服务器变量,但"开"和"关"的值在操作中不实际。您也可以使用 [SERVER_PORT] 或 [SERVER_PORT_SECURE], 但同样, 它们在操作中没有用处。

让我说明一下。以下规则将 http 的流量重定向到 ??/localtest.me/ http://www.localtest.me/。

<rule name="Redirect to www"> <match url="(.*)" /> <conditions> <add input="{HTTP_HOST}" pattern="^localtest\.me$" /> </conditions> <action type="Redirect" url="http://www.localtest.me/{R:1}" /> </rule>

问题是,即使最初的请求是 HTTPS,它也会强制请求 HTTP。

目前有四种不同的方法来处理这个问题,根据实际情况,可以选择这四种情况中的任何一种。选项 1 是我大部分时间使用的;选项 2 是最安全的选项;选项 3 和选项 4 仅需要考虑,如果您有一个更独特的情况。所有四个选项将适用于大多数情况。

选项1 – {CACHE_URL},单一规则

有一个服务器变量,有协议:{CACHE_URL}。此服务器变量包含整个 URL 字符串(例如 http://www.localtest.me:80/info.aspx?id=5)我们只需要提取 HTTP 或 HTTPS,我们将被设置。这往往是我处理这种情况的首选方法。

您可以在重写urL中使用CACHE_URL变量和背面引用的条件。问题是,如果规则依赖于逻辑上的"或"条件匹配,则需要匹配所有可能存在问题的条件。

因此,问题。如果您有多个条件设置为"匹配任何"而不是"匹配所有",则此选项将不起作用。但是,我发现我编写的所有规则中,95% 都使用"匹配所有",因此,作为懒惰的管理员,我喜欢这个简单的解决方案,只需要在规则中添加单个条件。需要注意的是,如果您使用"匹配任何",则必须考虑接下来的两个选项之一。

序言已经足够了。下面是它的工作原理。添加一个条件,检查[CACHE_URL]与模式为"^。"这样:

URL Rerite

您如何在://之前对部分进行反引用,这是我们珍藏的HTTP或HTTPS。在 URL 重写 2.0 或更高时,您可以检查"跨条件跟踪捕获组",将该条件作为第一个条件,并且您自己有 {C:1} 的背引用。

支持维护协议的"重定向到 www"示例将变成:

<rule name="Redirect to www" stopProcessing="true"> <match url="(.*)" /> <conditions trackAllCaptures="true"> <add input="{CACHE_URL}" pattern="^(.+)://" /> <add input="{HTTP_HOST}" pattern="^localtest\.me$" /> </conditions> <action type="Redirect" url="{C:1}://www.localtest.me/{R:1}" /> </rule>

这并不像微软给我们一个内置的 [HTTP_PROTOCOL] 变量那么容易, 但它非常接近。

我也喜欢这个选项,因为我经常为其他人创建规则示例,这种类型的规则是便携式的,因为它是在一个单一的规则中自成一体的。

选项2 – 使用 Rewrite Map

对于适用于"匹配任何"和"匹配所有"情况的安全规则,您可以使用Jeff 建议的重写地图解决方案。这是一个非常好的解决方案,唯一的缺点是设置它曾经如此轻微的额外努力,因为你需要创建一个重写地图之前,你创建规则。换句话说,如果您选择使用此作为处理协议的唯一方法,您将是安全的。

创建名为 MapProtocol 的重写地图后,您可以在任何规则操作中使用"[地图普罗托科尔:[HTTPS}}"来执行协议。下面是使用重写地图的示例。

<rewrite> <rules> <rule name="Redirect to www" stopProcessing="true"> <match url="(.*)" /> <conditions trackAllCaptures="false"> <add input="{HTTP_HOST}" pattern="^localtest\.me$" /> </conditions> <action type="Redirect" url="{MapProtocol:{HTTPS}}://www.localtest.me/{R:1}" /> </rule> </rules> <rewriteMaps> <rewriteMap name="MapProtocol"> <add key="on" value="https" /> <add key="off" value="http" /> </rewriteMap> </rewriteMaps> </rewrite>

选项3 – CACHE_URL,多规则

如果您有许多规则将使用该协议,您可以创建自己的服务器变量,可用于后续规则。此选项的设置并不比上面的选项 2 容易,但如果您喜欢更容易记住 [HTTP_PROTOCOL] 与 [MapProtocol: [ HTTPS} 的语法, 您可以使用它。

此规则的潜在问题是,如果您无法访问服务器级别(例如在共享环境中),则未经许可无法设置服务器变量。

首先,创建规则并将其置于规则集的顶部。您可以在服务器、站点或子折叠级别创建此。但是,如果您在站点或子折叠级别创建它,则服务器级别需要批准HTTP_PROTOCOL服务器变量。这可以通过导航到服务器级别的 URL 重写,单击"操作窗格中的"查看服务器变量",并添加HTTP_PROTOCOL,在 IIS 管理器中实现。如果您在服务器级别创建规则,则无需此步骤。

以下是创建HTTP_PROTOCOL的第一个规则的示例,然后是使用该规则的规则。创建HTTP_PROTOCOL规则只需在服务器上创建一次。

<rule name="Create HTTP_PROTOCOL"> <match url=".*" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{CACHE_URL}" pattern="^(.+)://" /> </conditions> <serverVariables> <set name="HTTP_PROTOCOL" value="{C:1}" /> </serverVariables> <action type="None" /> </rule> <rule name="Redirect to www" stopProcessing="true"> <match url="(.*)" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{HTTP_HOST}" pattern="^localtest\.me$" /> </conditions> <action type="Redirect" url="{HTTP_PROTOCOL}://www.localtest.me/{R:1}" /> </rule>

选项4 – 多规则

为了完成,我将包括一个如何实现同样的事情与多个规则的例子。我不认为有任何理由使用它在前面的例子,但我会包括一个例子反正。请注意,它只会适用于条件的"匹配所有"设置。

<rule name="Redirect to www - http" stopProcessing="true"> <match url="(.*)" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{HTTP_HOST}" pattern="^localtest\.me$" /> <add input="{HTTPS}" pattern="off" /> </conditions> <action type="Redirect" url="http://www.localtest.me/{R:1}" /> </rule> <rule name="Redirect to www - https" stopProcessing="true"> <match url="(.*)" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{HTTP_HOST}" pattern="^localtest\.me$" /> <add input="{HTTPS}" pattern="on" /> </conditions> <action type="Redirect" url="https://www.localtest.me/{R:1}" /> </rule>

结论

以下是从 URL 重写规则的操作调用协议 (HTTP 或 HTTPS) 的方法的四个工作示例。您可以使用您最喜欢的任何方法。我已经列出了他们,在有利于他们的顺序,虽然我可以看到有些人更喜欢选项2作为他们的第一选择。在任何情况下,希望您可以将此作为参考,用于在编写 URL 重写规则时在规则的操作中使用协议。

本站发布的文章受知识共享协议保护,转载、收录请标明出处。

评论


昵称:   邮箱:

Top
An error has occurred. This application may no longer respond until reloaded.Reload 🗙