【发布时间】:2021-12-28 06:25:36
【问题描述】:
我有一个网站,用户可以为该网站创建无限的子域。
我们的一位客户希望我们在标头上启用 HSTS,因此我在 .htaccess 中添加了以下规则:
Header set Strict-Transport-Security "max-age=63072000; includeSubDomains"
我们有一个通配符证书*.domain.com 来保护所有子域,因为我们不想为每个子域创建一个单独的证书。
问题是当有人要去www.subdomain.domain.com时,他们需要被重定向到subdomain.domain.com。
但 Chrome 正在阻止重定向,因为在 *.*.domain.com 级别上没有有效证书,并且 HSTS 规则使 Chrome 完全阻止重定向并出现 NET::ERR_CERT_COMMON_NAME_INVALID 错误。
.htaccess 中重要的部分:
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,QSA,NC,L]
RewriteCond %{HTTPS} off
RewriteRule ^/?(.*) https://%{HTTP_HOST}%{REQUEST_URI} [NC,QSA,R=301,L]
Header set Strict-Transport-Security "max-age=63072000; includeSubDomains"
Header always set Cache-Control "no-store, no-cache, must-revalidate"
我原以为 www 到非 www 的重定向会首先出现,因为它在 .htaccess 文件中更高。
【问题讨论】:
-
mod_rewrite和mod_headers是不同的模块,因此管理执行哪些 mod_rewrite 规则的规则不一定适用于其他模块。我认为您最好的选择是根据域使用 mod_rewrite 设置环境变量,并且仅在设置了该环境变量时才设置 HSTS。类似于:stackoverflow.com/questions/62559797/… -
@Sumurai8 我认为最大的问题是一旦人们访问了 sub.domain.com 就设置了 HSTS,这很好,但是 www.sub.domain.com 现在也启用了 HSTS .而且我无法删除 includeSubdomains,因为 .htaccess 是为 domain.com 和 sub.domain.com 共享的
标签: apache .htaccess redirect subdomain hsts