Apache 子域中的 SSL 重写规则

Apache 子域中的 SSL 重写规则

我部署了一个使用 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

相关内容