在不破坏单页ssl的情况下重写子域


Rewrite subdomain without breaking single page ssl

是否可以用具有单页ssl证书的域重写子域?

我想做的事:

将subdomain.domain.com重写为domain.com/index.php&page=子域

到目前为止,我得到了什么:

   RewriteCond %{HTTP_HOST} ^(.*)'.domain'.com [NC]
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^(.*)$ /index.php?user=%1&req=$1 [L,QSA]

这给了我一个糟糕的SSL证书,因为我没有子域证书。在php中的$_SERVER上使用var_dump返回以下内容:

["SCRIPT_URI"]=> string(24) "https://subdomain.domain.com/" 
["HTTPS"]=> string(2) "on"  
["SSL_TLS_SNI"]=> string(15) "subdomain.domain.com"  
["SSL_SERVER_S_DN_CN"]=> string(14) "www.domain.com"

所以它仍然将其作为子域传递,而不是重定向它。

如果我使用完整的域作为重写规则,它是有效的,但它也会将标题栏中的url更改为domain.com/index.php?user=子域,而不是保留url:

RewriteRule ^(.*)$ https://domain.com/index.php?user=%1&req=$1 [L,QSA]

那么,如何将子域重写为domain.com/index.php呢?user=subdomain,同时保留subdomain.domain.com,并且仍然可以使用一页ssl证书?

不可能让Web服务器在子域(例如subdomain.domain.com)上提供网页,但保留仅在domain.com上有效的单页SSL证书。从技术上讲,这是可能的,但这样做会使浏览器警告用户SSL证书无效,并在访问者中对您的网站产生不信任。现在有几个选项可以解决这个问题:

  1. 获取通配符SSL证书
  2. 获取多使用者替代名称SSL证书(旧版/移动浏览器可能会警告用户此类证书)
  3. 制作一个新的apache虚拟主机配置,并让apache提供不同的单页SSL证书(subdomain.domain.com需要获得该证书)

这里最好的选择是3,因为你可以在几个网站上获得免费的一页SSL证书,并将其用于你的目的(例如StartSSL、LetsCrypt)。设置一个新的虚拟主机配置并不困难,因为你可以复制粘贴网站现有虚拟主机配置的大部分(你只需要更改一些东西(例如SSL证书、SSL密钥、SSL链、网站名称…))。