【问题标题】:rewrite rule not redirecting http to https重写规则不将 http 重定向到 https
【发布时间】:2013-06-02 16:43:31
【问题描述】:

目前,我们正在尝试在我们的 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

【问题讨论】:

  • 似乎没问题,是否尝试从 IIS url 重写模块编辑规则?没事吧?
  • 我认为这是 mod rewrite 的特殊之处。 (。*) 工作正常。但其他正则表达式不起作用

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


【解决方案1】:

url 中使用的模式在这里只是为了再次匹配请求的路径(并且只有路径,而不是 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

【讨论】:

  • 这应该是因为用于检查{HTTP_HOST} 的模式只是验证它是否在mysite.com 之前完成。因此,例如 www.mysite.comblog.mysite.com 将是有效的。
  • 当我写完我的意思是如果它更容易理解就结束了!
【解决方案2】:

您需要正则表达式吗?如果您只是将所有流量重定向到 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 响应通常更适合SEO。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-10
    • 2015-12-26
    • 2019-08-03
    • 2014-11-04
    • 2018-07-30
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    相关资源
    最近更新 更多