Правила Apache Rewrite для SSL в поддомене

У меня развернут веб-сайт, который использует кохану и переписывание URL, чтобы сделать URL более спокойными. Это отлично работает.

У меня также есть Moodle, установленный в подкаталоге на том же сервере, и поддомен, определенный для этого каталога. Таким образом, Moodle установлен в каталоге с именем Students, а поддомен - Students.example.com. Это тоже отлично работает.

Я сейчас пытаюсь установить сертификат SSL, который мне нужен только на поддомен. У меня есть сертификат подстановочного знака Comodo, поэтому он должен работать с поддоменами. Когда я использую https://example.com/ он работает нормально, поэтому я вижу, что сертификат SSL в силе. Тем не менее, когда я пытаюсь https://students.example.com/ он перенаправляет на основной сайт. http://students.example.com/ работает хорошо, хотя.

Файл.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, если это имеет какое-либо значение.

3 ответа

Я подозреваю, что у вас может быть другая проблема. HTTP-запрос выглядит примерно так:

GET /foo.php HTTP/1.1
Host: monkedung.example.com
Keep-Alive: timeout=15
Connection: Keep-Alive

и т.д. Когда вы шифруете его с помощью SSL, все после строки GET шифруется, поэтому у Apache нет возможности даже узнать, какой хост вы запрашиваете. Не зная хоста, он не может узнать, какой сертификат использовать для расшифровки запроса. Он также не знает, в какой каталог перенаправлять, какой файл.htaccess использовать или что-либо еще, определяемое хостом. По этой причине, AFAIK вы можете использовать только один хост SSL на IP-адрес.

Я бы попробовал установить

students.example.com

в качестве домена Apache по умолчанию и example.com, если это единственный, для которого вы хотите использовать ssl. Я также включил бы отладку для ваших правил перезаписи, чтобы вы могли видеть, действительно ли они запускаются. Если проблема - проблема ssl, упомянутая выше, я подозреваю, что вы даже не зашли так далеко.

Надеюсь это поможет.

Вы просматривали свой config.php в Moodle после переключения SSL?

Обратите внимание, что ваш $CFG->wwwroot сейчас изменилось. Это должен быть https: //students.example.com

Похоже, вы пытаетесь разместить example.com и Students.example.com на одном IP-адресе. Это нормально, если вы используете обычный 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>
Другие вопросы по тегам