【问题标题】:How to force certain sections of the website to be browsed under SSL?如何强制在 SSL 下浏览网站的某些部分?
【发布时间】:2015-05-15 09:27:04
【问题描述】:

在我们的网站上,某些部分或页面涉及敏感的用户或帐户信息。我想强制用户在 HTTPS 下浏览这些页面。而其他具有公共内容的页面应该在 HTTP 下可用。我打算在 IIS 上安装 url Rewrite 模块并编写规则来实现这一点。我不确定如何在 web.config 中编写重定向规则。

服务器:IIS 7.5

SSL 下的页面示例:

  1. mywebsite.com.au/login

  2. mywebsite.com.au/login/

  3. mywebsite.com.au/member
  4. mywebsite.com.au/member/dashboard
  5. mywebsite.com.au/member/account
  6. mywebsite.com.au/member/.......

所有不属于上述 URL 模式的页面应仅在 http 下浏览。

【问题讨论】:

  • 这是 MVC 吗?如果是这样,您可以使用过滤器更干净地实现这一点。
  • 它是 MVC,但建立在名为 Umbraco 的内容管理系统之上。我不想对 Umbraco 代码进行任何更改。

标签: asp.net iis url-rewriting iis-7.5


【解决方案1】:

Umbraco 已经附带了 UrlRewriging.net 组件。检查你的config 文件夹,你会发现 urlrewriting.config 这是实现你所追求的一种潜在方法。以下是规则可能的外观示例(未经测试):

<add name="ForceSSLLogin"
  virtualUrl="^http://(.*)/login(.*)"
  rewriteUrlParameter="ExcludeFromClientQueryString"
  destinationUrl="https://$1/login$2"
  redirect="Domain"
  ignoreCase="true" />

<add name="ForceSSLMembers"
  virtualUrl="^http://(.*)/member(.*)"
  rewriteUrlParameter="ExcludeFromClientQueryString"
  destinationUrl="https://$1/member$2"
  redirect="Domain"
  ignoreCase="true" />    

我不太喜欢这种解决方案,因为如果有人更改了会员区页面的名称,那么 URL 重写将不再起作用。

你没有说你使用的是什么版本的 Umbraco,但实际上可能更好的是尝试这样的包:

HTTPS 重定向

HTTPS 重定向提供了一种简单的机制,可以根据文档类型(别名)、节点 ID 或模板别名将 URL 从 HTTP 切换到 HTTPS (SSL)。

https://our.umbraco.org/projects/website-utilities/https-redirect

【讨论】:

  • 很好的建议。我希望你早点发布它。投票赞成这个建议。
【解决方案2】:

这里是我为实现 http->https 和 https->http 重定向而实施的重写规则。请注意,在 http->https 重定向时,您还必须将对 css、js 和图像文件的请求从 http 重定向到 https,否则浏览器可能会拒绝执行这些文件。

You can also check the discussion on IIS forum.

<rewrite>
    <rules>
        <rule name="HTTPS to HTTP redirect" stopProcessing="true">
            <match url="(.*)" />
            <conditions>
                <add input="{HTTPS}" pattern="ON" />
                <add input="{URL}" pattern="^/login" negate="true" />
                <add input="{URL}" pattern="^/member" negate="true" />
                <add input="{URL}" pattern="^/(.*)(.js|.css|.png|.jpg|.woff)" negate="true" />
            </conditions>
            <action type="Redirect" redirectType="Permanent" url="http://{HTTP_HOST}/{R:1}" />
        </rule>
        <rule name="HTTP to HTTPS redirect login" stopProcessing="true">
            <match url="^login" />
            <conditions>
              <add input="{HTTPS}" pattern="OFF" />
            </conditions>
            <action type="Redirect" redirectType="Permanent" url="https://{HTTP_HOST}/login/" />
        </rule>
        <rule name="HTTP to HTTPS redirect member" stopProcessing="true">
            <match url="^member/(.*)" />
            <conditions>
              <add input="{HTTPS}" pattern="OFF" />
            </conditions>
            <action type="Redirect" redirectType="Permanent" url="https://{HTTP_HOST}/member/{R:1}" />
        </rule>
        <rule name="HTTP to HTTPS redirect resources" stopProcessing="true">
            <match url="http://(.*)(.css|.js|.png|.jpg|.woff)" />
            <conditions>
              <add input="{HTTPS}" pattern="ON" />
            </conditions>
            <action type="Redirect" redirectType="Permanent" url="https://{HTTP_HOST}/{R:1}{R:2}" />
        </rule>         
    </rules>
</rewrite>

【讨论】:

  • 我认为您可以进一步简化这一点,并通过匹配 url 条件并捕获它们来处理成员和登录区域的规则。你仍然有这个问题,如果页面的 url 发生变化,那么规则就会中断,但这是一个相对不太可能发生的情况。
  • 正确。我可以将会员和登录页面的网址合并到一个规则中。我会发布一个更新的版本。不过,我不会担心对 url 的更改,任何更改都可能会破坏其他数千件事。我们无法在未来证明一切。
  • 最后的&lt;add input="{HTTPS}" pattern="ON" /&gt;不应该是OFF吗?此外,我认为该条件永远不会适用于该正则表达式。
  • 如果您的match 只查找http://,然后使用&lt;conditions logicalGrouping="MatchAny"&gt; 并在那里查找“登录”、“会员”等不是更好吗?跨度>
猜你喜欢
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 2018-06-22
  • 1970-01-01
  • 2013-12-01
相关资源
最近更新 更多