Sco*_*ell 23 iis-7 url-rewriting
我正在一个使用IIS 7的URL重写功能的网站上进行从example.com到www.example.com的永久重定向,以及从类似域名重写到"主要"域名,例如来自www. examples.com到www.example.com.
这个重写规则 - 如下所示 - 已经有一段时间了.但是,我们最近添加了HTTPS支持,并注意到如果用户访问要重写到www.example.com的其中一个URL,则会删除HTTPS.例如,如果用户访问https://example.com,则会将其重定向到http://www.example.com,而我们希望将其发送到https://www.example.com.
这是感兴趣的重写规则(在Web.config中):
<rule name="Canonical Host Name" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTP_HOST}" pattern="^example\.com$" />
<add input="{HTTP_HOST}" pattern="^(www\.)?example\.net$" />
<add input="{HTTP_HOST}" pattern="^(www\.)?example\.info$" />
<add input="{HTTP_HOST}" pattern="^(www\.)?examples\.com$" />
</conditions>
<action type="Redirect" url="http://www.example.com/{R:1}" redirectType="Permanent" />
</rule>
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,动作元素的URL直接属性点到http://,所以我知道为什么https://example.com会被重定向到http://www.example.com.我的问题是,我该如何解决这个问题?我试图(天真地)从url属性中删除http://部分,但这不起作用.
Ral*_*h N 40
这是Scott对Hasan改进的回答.这应该涵盖混合的SSL /非SSL站点.该规则基本上表示"如果网址没有www.example.com",请执行永久重定向.基本上......您正在重定向无需www或直接访问您的IP地址的人.
<rewrite>
<rules>
<rule name="Canonical Host Name" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" pattern="^www\.example\.com$" negate="true" />
</conditions>
<action type="Redirect" url="{MapSSL:{HTTPS}}www.example.com/{R:1}" redirectType="Permanent" />
</rule>
</rules>
<rewriteMaps>
<rewriteMap name="MapSSL" defaultValue="http://">
<add key="ON" value="https://" />
<add key="OFF" value="http://" />
</rewriteMap>
</rewriteMaps>
</rewrite>
Run Code Online (Sandbox Code Playgroud)
Sco*_*ell 11
在同事的帮助下找出答案.
我需要在{HTTPS}上使用带有条件的多个规则.请注意以下规则中的{HTTPS}条件.
<rule name="Canonical Host Name (HTTP)" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTPS}" pattern="OFF" />
<add input="{HTTP_HOST}" pattern="^example\.com$" />
</conditions>
<action type="Redirect" url="http://www.example.com/{R:1}" redirectType="Permanent" />
</rule>
<rule name="Canonical Host Name (HTTPS)" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTPS}" pattern="ON" />
<add input="{HTTP_HOST}" pattern="^example\.com$" />
</conditions>
<action type="Redirect" url="https://www.example.com/{R:1}" redirectType="Permanent" />
</rule>
Run Code Online (Sandbox Code Playgroud)
然后,我重复上面的规则对用于备用域名.
小智 7
如果您只想根据当前使用的协议进行重定向(根据您的上一个示例),那么有一个更简单的解决方案可以将您需要的规则数量减半.以下是我从我的同事那里学到的东西.
如您所见,{HTTPS}参数将包含值ON或OFF.您可以将此值映射到https://或http://,将此值提供给重写映射.
以下是这将如何工作:
1-创建用于映射{HTTPS}值的重写映射部分:
<rewriteMap name="MapProtocol" defaultValue="OFF">
<add key="ON" value="https://" />
<add key="OFF" value="http://" />
</rewriteMap>
Run Code Online (Sandbox Code Playgroud)
由您自己决定是否只包含协议,或者分号和正斜杠.它对解决方案无关紧要,但无论您何时提及它,请记住它.
2-只要您需要,请参阅此地图.在此示例中,它用于出站规则,但它也适用于您的场景:
<rule name="Outbound-Rule Name" stopProcessing="true" preCondition="ResponseIsHtml">
<match filterByTags="A, Link, Script" pattern="YOUR PATTERN" />
<action type="Rewrite" value="{MapProtocol:{HTTPS}}{HTTP_HOST}/REST OF RELATIVE LINK HERE" />
</rule>
Run Code Online (Sandbox Code Playgroud)
就是这样,URL Rewrite模块现在应该自动使用正确的链接协议,具体取决于您使用的是https,还是http.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
25239 次 |
| 最近记录: |