Правила 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>