【问题标题】:How do I stop the rewrite to force https from affecting all the subdomains如何停止重写以强制 https 影响所有子域
【发布时间】:2021-12-04 13:06:09
【问题描述】:

我有这条规则可以将所有 http 连接切换到 https。编辑显示整个文件

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.kiwi$ [OR]
RewriteCond %{HTTP_HOST} ^example\.nz$ [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.nz$
RewriteRule ^/?$ "https\:\/\/example\.kiwi\/$1" [R=301,L]
RewriteCond %{HTTP_HOST} ^example\.app$ [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.app$
RewriteRule ^/?$ "https\:\/\/example\.kiwi\/$1" [R=301,L]
RewriteCond %{HTTP_HOST} ^example\.online$ [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.online$
RewriteRule ^/?$ "https\:\/\/example\.kiwi\/$1" [R=301,L]
RewriteCond %{HTTP_HOST} ^example\.software$ [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.software$
RewriteRule ^/?$ "https\:\/\/example\.kiwi\/$1" [R=301,L]

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
Header always set Content-Security-Policy "upgrade-insecure-requests;"
Header always setifempty Strict-Transport-Security "max-age=31536000" env=HTTPS
Header append X-Frame-Options: "SAMEORIGIN"

不幸的是,它会影响 mail.domain.com(和其他)之类的东西。如何阻止任何/所有子域升级?

【问题讨论】:

    标签: .htaccess subdomain


    【解决方案1】:

    假设您只想将 www 子域和域顶点重定向到 HTTPS,那么您可以检查 RewriteCond 指令中的 Host 标头。

    例如:

    RewriteCond %{HTTP_HOST} ^(www\.)?example\.com [NC]
    RewriteCond %{HTTPS} !=on 
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
    

    以上只会重定向www.example.comexample.com

    我已经删除了RewriteRule 模式(即^(.*)$)中的捕获组,因为这里没有使用它。

    使用 302(临时)重定向进行测试以避免缓存问题。

    您需要在测试前清除浏览器缓存。

    还要考虑在重定向中规范化主机名(www 与非 www)。

    Header always set Content-Security-Policy "upgrade-insecure-requests;"
    

    但是,由于现在并非所有内容都是 HTTPS,如果您通过 HTTP 从子域加载资源,则应根据请求是否通过 HTTPS 开始有条件地发送此标头

    例如,在 Apache 2.4.10+ 上,您可以在 Header 指令中使用 Apache 表达式语法:

    Header always set Content-Security-Policy "upgrade-insecure-requests;" "expr=%{HTTPS} == 'on'"
    

    更新:

    我希望使用不同的后缀,例如 example.software 和 example.app,所以我应该将“.com”替换为“.?”

    您可以简单地在第一个条件中删除正则表达式中的 TLD。例如:

    RewriteCond %{HTTP_HOST} ^(www\.)?example\. [NC]
    

    这现在将匹配example.comexample.softwarewww.example.app 等。但如果您碰巧有一个与域本身同名的子域(例如example.example.com),它将失败 - 但这应该是避免。

    我已经编辑了帖子以显示我的整个文件,以防有副作用。在网站构建期间,我有许多域都被重定向。

    这不会影响 HTTP 到 HTTPS 的重定向。这些指令将所有其他域重定向到https://example.kiwi - 因此,当处理这些指令时,无论如何都会绕过(不需要)以后的 HTTP 到 HTTPS 重定向。

    但是,这些重定向存在一些问题。

    • “暂时重定向” - 您暗示这些重定向是临时的,但您使用的是 301(永久)响应。这会导致重定向被永久缓存,这可能无法撤消。如果这是临时的,那么它应该是 302(临时)重定向。
    • ^/?$ - 您只是重定向对文档根目录(即主页)的请求。不会重定向example.nz/foo 的请求。这进一步看起来像是一个错误,因为您在 substitution 字符串中使用了 $1 反向引用,因此该字符串将始终为空。

    这些重定向指令也可以大大简化。如果您“临时”将所有其他域重定向到https://example.kiwi/<url>,那么您可以使用这样的单个规则来代替:

    RewriteCond %{HTTP_HOST} !=example.kiwi
    RewriteRule ^ https://example.kiwi%{REQUEST_URI} [R=302,L]
    

    其中!=example.kiwi 是一个否定 完全匹配字符串比较(不是正则表达式)。 条件 成功则Host 标头与example.kiwi 不匹配。


    旁白:

    Header always setifempty Strict-Transport-Security "max-age=31536000" env=HTTPS
    

    您不应该在仍在开发和更改领域时实施 HSTS。但是,您似乎没有在您发布的代码中设置 HTTPS env var,因此无论如何这很可能会被忽略。 (?)

    注意:env=HTTPS 未检查 server 同名变量。

    【讨论】:

    • 我希望使用不同的后缀,例如 example.software 和 example.app,所以我应该将“.com”替换为“.?”
    • 或者应该是.[a-z]*
    • 我已经编辑了帖子以显示我的整个文件,以防有副作用。在网站构建期间,我有许多域都被重定向。
    • @RohitGupta 我已经更新了我的答案以解决这些问题,并在您的问题中更新了.htaccess 文件。
    • 我不打算更改域,但是我无法抗拒 .software 和 .app 的报价。我只是打算稍后以不同的方式使用 .app。但是计划可能会改变,所以我将 301 更改为 302。我损坏的“代码”来自各种“专家”网站,它们解释不多,并且提供了不起作用的东西。 :-) 我认为最好在网站没有流量的情况下将所有鸭子排成一排。
    猜你喜欢
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2023-04-02
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多