![Apache 子域中的 SSL 重写规则](https://linux22.com/image/644710/Apache%20%E5%AD%90%E5%9F%9F%E4%B8%AD%E7%9A%84%20SSL%20%E9%87%8D%E5%86%99%E8%A7%84%E5%88%99.png)
我部署了一个使用 kohana 和 URL 重写来使 URL 更加 RESTful 的网站。这很好用。
我还在同一台服务器上的子目录中安装了 Moodle,并为该目录定义了一个子域。因此,Moodle 安装在名为 students 的目录中,子域为 students.example.com。这也可以正常工作。
我现在尝试安装一个只需要在子域上使用的 SSL 证书。我有一个 Comodo 通配符证书,因此它应该能够与子域一起使用。当我使用https://example.com它运行正常,所以我可以看到 SSL 证书已生效。但是,当我尝试https://students.example.com它会重定向到主站点。http://students.example.com但工作正常。
适用于 kohana 重写规则的 .htaccess 文件是:
# Use PHP5.4 Single php.ini as default
AddHandler application/x-httpd-php54s .php
# Turn on URL rewriting
RewriteEngine On
# Installation directory
RewriteBase /
# Protect hidden files from being viewed
<Files .*>
Order Deny,Allow
Deny From All
</Files>
# Protect application and system files from being viewed
RewriteRule ^(?:application|modules|system)\b index.php/$0 [L]
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT]
Options -Indexes
根据文档,我需要为子域添加以下规则:
#.htaccess WildCard SSL
RewriteCond %{HTTP_HOST} ^students.example.com$
RewriteCond %{REQUEST_URI} !^/students/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /students/$1
RewriteCond %{HTTP_HOST} ^students.example.com$
RewriteRule ^(/)?$ students/index.php [L]
我尝试将其添加为第一条规则和第二条规则,但都没有奏效。我现在明白我必须编写一组新规则才能实现我想要的功能。
任何关于如何实现此目的的建议都将不胜感激。如果这有任何不同,此网站由 Bluehost 托管。
答案1
我怀疑你可能还有另一个问题。HTTP 请求如下所示:
GET /foo.php HTTP/1.1
Host: monkedung.example.com
Keep-Alive: timeout=15
Connection: Keep-Alive
等等。当您使用 SSL 加密时,GET 行之后的所有内容都会被加密,因此 Apache 甚至无法知道您请求的主机。如果不知道主机,它就无法知道要使用哪个证书来解密请求。它也不知道要重定向到哪个目录、要使用哪个 .htaccess 文件或主机确定的任何其他内容。因此,据我所知,每个 IP 地址只能使用一个 ssl 主机。
我会尝试设置
students.example.com
作为默认的 apache 域,如果这是您要使用 SSL 的唯一域,则使用 example.com。我还会为您的重写规则打开调试功能,以便您可以查看它们是否真正起作用。如果问题是上面提到的 SSL 问题,我怀疑您甚至还没有走到那一步。
希望这可以帮助。
答案2
看起来您正在尝试在同一个 IP 地址上托管 example.com 和 students.example.com。如果您使用的是常规 HTTP,那么这没有问题,但如果您使用的是 HTTPS(端口 443),则需要在另一个 IP 地址上提供服务。
<VirtualHost *:80>
DocumentRoot /var/www/example.com
ServerName example.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/students.example.com
ServerName students.example.com
</VirtualHost>
<VirtualHost 192.168.1.10:443>
DocumentRoot /var/www/example.com
ServerName example.com
SSLEngine on
SSLCertificateFile /path/to/example.com.cert
SSLCertificateKeyFile /path/to/example.com.key
</VirtualHost>
<VirtualHost 192.168.1.11:443>
DocumentRoot /var/www/students.example.com
ServerName students.example.com
SSLEngine on
SSLCertificateFile /path/to/example.com.cert
SSLCertificateKeyFile /path/to/example.com.key
</VirtualHost>
答案3
SSL 切换后,您是否检查过 Moodle 中的 config.php?
请注意,您的$CFG->wwwroot
现在已更改。它应该是 https://students.example.com