【问题标题】:Force https for main domain and http for all subdomains对主域强制使用 https,对所有子域强制使用 http
【发布时间】:2015-05-01 20:30:14
【问题描述】:

我正在尝试使用我网站的 .htaccess 文件重写主域的所有 URL 以强制使用 HTTPS,而应强制任何子域上的所有 URL 使用 HTTP。

目前我有以下:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !=([a-z0-9-]+).domain.com
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

这会在主域 (https://domain.com) 以及任何子域上强制使用 HTTPS。我想我在第三行有点搞砸了,但就是不太清楚那里需要做什么。

此外,我认为第三行只会将子域从重写规则中排除到 HTTPS,但如果有人点击链接或输入https://sub.domain.com,他们可能仍然会通过并最终收到不安全的内容警告.也许那里需要另一个条件?

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    RewriteCond variable =string 形式的条件会将变量与字典字符串(或换句话说:字符串原样)进行比较,而不是正则表达式。大概RewriteCond variable !=string 的意思不是那个字符串。

    您想比较第二条规则的正则表达式。第一条规则很简单,因为我们已经知道整个域。

    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP_HOST} =domain.com
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    
    RewriteCond %{HTTPS} on
    RewriteCond %{HTTP_HOST} ^.+\.domain\.com$
    RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    

    在您测试一切都按预期工作后,将R 标志更改为R=301

    我相信当用户转到https://sub.domain.com 时,它仍然会产生安全警告。这是因为如果证书无效,浏览器将无法完成握手。相反,它将提示用户连接可能被劫持,并为用户提供继续的选项。如果用户继续,用户将被重定向,并且不会显示安全警告。 确保任何地方都没有指向您的子域的 https 链接!

    【讨论】:

    • 我已经编辑了一些关于 https-to-http-redirect 的更多信息。
    • 我希望能够避免您提到的安全警告,但我正在查看我的网站,并且没有直接指向带有 https 的子域的链接,所以只有这样才能有人会如果他们手动输入https://sub.domain.com,那么就可以做到这一点,此时这是他们这样做的问题。谢谢!
    • 如果我想反其道而行之,那就是强制 sub.domain.com 到 https,而不是强制主域到 https,我可以翻转这些吗?
    • 是的。第一条规则明确地只匹配没有子域的域(所以甚至没有 www),第二条规则匹配所有子域(包括 www)。如果您在第一条规则中使用%{HTTPS} on,在第二条规则中使用%{HTTPS} off,它应该可以正常工作。
    猜你喜欢
    • 2014-01-20
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 2016-09-25
    • 2016-06-02
    • 2011-09-15
    • 2016-03-20
    • 2014-08-15
    相关资源
    最近更新 更多