重写规则不将http重定向到https

时间:2013-06-06 15:24:59

标签: asp.net-mvc iis-7 url-rewriting

目前,我们正在尝试在我们的web.config中设置从htttp到https的重定向,仅限于我们使用的域。但它不起作用。

<rewrite>
        <rules>
            <rule name="HTTP to HTTPS redirect" stopProcessing="true">
                <match url="^(?:http(?:s)?:\/\/)?(?:[^\\.]+\.)?mysite\.com(\/.*)?$" />
                <conditions>
                    <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                </conditions>
                <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
            </rule>
        </rules>
    </rewrite>

此规则在正则表达式编辑器中正常工作。但不是在网络服务器上。 http://rubular.com/r/3NQTozcigZ

^(?:http(?:s)?:\/\/)?(?:[^\\.]+\.)?mysite\.com(\/.*)?$

查看failedreqlogfiles pattern_match是错误的。任何见解?

在做了一些测试后,我发现这很有效。

http://sub.site.com/

但这不起作用。

http://sub.site.com/Account/Logon

2 个答案:

答案 0 :(得分:1)

你需要正则表达式吗?如果您只是将所有流量重定向到HTTPS,那么这样的事情应该有效:

<rule name="HTTP to HTTPS redirect" stopProcessing="true">
   <conditions>
      <add input="{HTTPS}" pattern="off" ignoreCase="true" />
   </conditions>

   <action 
      type="Redirect" 
      redirectType="Permanent" 
      url="https://{HTTP_HOST}{REQUEST_URI}" 
      appendQueryString="false" 
   />
</rule>

我倾向于使用redirectType="Permanent"代替"Found",因为HTTP 301响应通常更适合搜索引擎优化。

如果您要将网站永久性地转移到HTTPS,则可能还需要查看发送the Strict-Transport-Security header。这将确保现代浏览器不会通过非安全连接请求您的网站。

答案 1 :(得分:1)

url中使用的模式只会再次匹配请求的路径(并且只匹配路径,而不是网址)。

如果您想检查域名以及是否使用https,您必须依赖以下条件:

<rule name="Redirect mysite.com to HTTPS" stopProcessing="true">
  <match url=".*" />
  <conditions logicalGrouping="MatchAll">
    <add input="{HTTPS}" pattern="^OFF$" />
    <add input="{HTTP_HOST}" pattern="mysite\.com$" />
  </conditions>
  <action type="Redirect" url="https://{HTTP_HOST}/{R:0}" />
</rule>

此规则将检查任何路径(logicalGrouping="MatchAll")上的两个条件是否为真(即.*的用途):

  • 请求未使用HTTPS
  • 请求的域名以mysite.com
  • 结尾

供参考:http://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference#Accessing_URL_Parts_from_a_Rewrite_Rule