【问题标题】:how do I enforce https connections for main domain while also enforcing http for subdomains?如何对主域强制执行 https 连接,同时对子域强制执行 http?
【发布时间】:2021-03-29 09:26:51
【问题描述】:

在 Wordpress 多站点安装的上下文中,我需要对主域强制执行 https 连接(我们称之为 https://site.lt),同时对子域强制执行不安全的连接(http://en.site.lthttp://ru.site.lt)。我需要通过配置 .htaccess 文件在共享主机上执行此操作。问题是,托管服务提供商仅为域和配置的子域安装 Let's Encrypt 证书,但不支持通配符,但 Wordpress Multisite 使用虚拟子域(没有 en/ 或 ru/ 目录对应子域名)。所以我需要尽可能使用 ssl,但要避免子域上出现不安全的连接警告。

这是我现在拥有的(“MY CODE HERE”标记我偏离 WP 默认值的地方):

RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]

## MY CODE HERE:
RewriteCond %{HTTPS} =on
RewriteCond %{HTTP_HOST} ^ru.site.lt$ [NC,OR]
RewriteCond %{HTTP_HOST} ^en.site.lt$ [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTPS} =off
RewriteCond %{HTTP_HOST} !^en.site.lt$ [NC]
RewriteCond %{HTTP_HOST} !^ru.site.lt$ [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
## END MY CODE

# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]

它确实在主域上强制执行 https,但它对子域的工作方式有限。如果我尝试打开https://en.site.lt,首先我会收到一个警告屏幕,提示连接不安全,只有当我接受不安全的连接(例外)后,重写规则才会启动,我会被重定向到 http 站点...当用户接受不安全的连接时,这已经毫无意义了。

【问题讨论】:

  • 您的子域在https 上工作吗?
  • 好吧,只有当你添加一个安全例外。浏览器抱怨证书不匹配。这就是糟糕的用户体验。
  • 我已经用我当前的重写规则更新了我的问题。

标签: .htaccess ssl wildcard multisite wildcard-subdomain


【解决方案1】:

对于同时涵盖域和子域的 SSL/TSL 证书,它必须是通配符证书。通配符证书是应用于域及其所有子域的数字证书。

*...传统的 SSL 证书适用于单个域,例如 域名.com。 .domain.com 的通配符证书也将 保护mail.domain.com、vpn.domain.com、payment.domain.com等...

了解更多关于通配符证书@https://en.wikipedia.org/wiki/Wildcard_certificate
来源@https://searchsecurity.techtarget.com/definition/wildcard-certificate

...它确实在主域上强制执行 https,但它对子域的工作方式有限...

订阅证书后,该证书将交付给任何当前存在的域和子域。如果您的子域是在您订阅证书之后创建的,您需要申请一个新的。通常该过程是免费的,可以从您的托管服务提供商网站完成。

在大多数情况下,您甚至不需要触摸您的 .htaccess 关于 SSL/TSL 证书。
您唯一要确保的是将任何 http 请求重定向到 https 请求:RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

【讨论】:

  • 问题是我的子域没有在服务器本身中定义(这涉及在 public_html 下的文件系统中创建一个文件夹以及在托管配置中的一些配置规则)。因此,服务器对它们一无所知,也无法请求涵盖子域的证书。它几乎不允许在配置中使用通配符子域,但子域本身是由 Wordpress 多站点安装提供的。并且出于某种原因,托管服务提供商不提供通配符 Let's Encrypt 证书(我的意思是涵盖任何子域名的证书)...
猜你喜欢
  • 1970-01-01
  • 2014-01-20
  • 2019-04-20
  • 2014-08-15
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多