Я бы хотел сделать такой виртуальный хост:
<VirtualHost *:80 *:443>
<IfPort 443>
SSLEngine On
...
</IfPort>
...
</VirtualHost>
Итак, если доступ к хосту был осуществлен через порт 443, я хочу добавить некоторые дополнительные функции. Могу ли я как-то добиться этого или мне нужно разделить это на 2 виртуальных хоста?
я использую mod_macro
чтобы решить эту проблему на сервере с множеством разных доменов ... Установите модуль (отличается в зависимости от ОС / дистрибутива), затем настройте что-то вроде этого:
LoadModule macro_module libexec/apache22/mod_macro.so
<Macro VHost $host>
<VirtualHost *:80>
DocumentRoot /usr/local/www/$host/data
ServerName $host
ServerAlias *.$host
ScriptAlias /cgi-bin/ "/usr/local/www/$host/cgi-bin/"
IncludeOptional etc/apache22/vhosts/$host
</VirtualHost>
</Macro>
<Macro VHostSSL $host>
<VirtualHost *:80>
DocumentRoot /usr/local/www/$host/data
ServerName $host
ServerAlias *.$host
ScriptAlias /cgi-bin/ "/usr/local/www/$host/cgi-bin/"
IncludeOptional etc/apache22/vhosts/$host
</VirtualHost>
<VirtualHost *:443>
DocumentRoot /usr/local/www/$host/data
ServerName $host
ServerAlias *.$host
SSLEngine on
SSLCertificateFile /usr/local/www/$host/ssl/$host.crt
SSLCertificateKeyFile /usr/local/www/$host/ssl/$host.key
ScriptAlias /cgi-bin/ "/usr/local/www/$host/cgi-bin/"
IncludeOptional etc/apache22/vhosts/$host
</VirtualHost>
</Macro>
Use VHostSSL example.com
Use VHost example.net
Очень просто добавить новый домен; любые конфигурации, специфичные для домена, помещаются во включаемый файл.
Другой вариант избежать дублирования - сохранить конфигурацию виртуального хоста в определенном файле и вытащить ее с помощью include:
/etc/path/to/config/example.com.conf
:
ServerName example.com.conf
DocumentRoot /var/www/something
# Any other config you want to apply to both vhosts
И ваш файл виртуальных хостов:
<VirtualHost *:443>
SSLEngine on
# Other SSL directives
Include /etc/path/to/config/example.com.conf
</VirtualHost>
<VirtualHost *:80>
Include /etc/path/to/config/example.com.conf
</VirtualHost>
используя решение Джона, я получаю это
Apache 2 is starting ...
AH00526: Syntax error on line 53 of .../httpd-vhosts.conf:
SSLEngine not allowed here
как сказал Джон, лучший способ - иметь 2 виртуальных хоста; но мой код виртуального хоста состоял из более чем 150 строк (много обратных прокси), поскольку я не хотел иметь по 2 каждого кода (и очень длинный файл конфигурации) В итоге я сделал это, что работает:
1.Создайте виртуальный хост для виртуального хоста без SSL.
2.Создайте еще один виртуальный хост и обратный прокси к первому виртуальному хосту.
<VirtualHost *:443>
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "...cert.crt"
SSLCertificateKeyFile "...server.ssl.key"
... (any ssl specific config)
ProxyPreserveHost On
ProxyPass / http://localhost:80/
ProxyPassReverse http://localhost:80/ http://yourdomain.com/
</VirtualHost>
это совсем не хорошее или удобное для производительности решение, но если причина нежелания 2 виртуальных хостов заключается в том, чтобы не допустить наличия 2 версий всех конфигураций виртуальных хостов (что означает изменение 2 строк каждый раз, когда вы хотите что-то изменить), это работает.
Взгляните на Apache If
структура и управлять запросом. Видеть основная документация для If
s и список доступных выражений для использования в нем. Вы можете сделать что-то вроде:
<If "%{SERVER_PORT} == '443'">
# Do stuff
</If>
Что касается вашего VirtualHost
, я не вижу такого решения в документации Apache2. Видеть http://httpd.apache.org/docs/2.2/en/vhosts/examples.html#port и попробуйте свой вариант: Apache2 использует аналогичный для разных IP-адресов вместо разных портов (http://httpd.apache.org/docs/2.2/en/vhosts/examples.html#intraextra).
Я бы все же рекомендовал использовать 2 разных виртуальных хоста, что намного понятнее. Вам понадобится два NameVirtualHost
и Listen
в твоем apache2.conf
файл, во всяком случае.
редактировать
Я не понимал, что это решение на самом деле вызывает ошибку, но давайте вернемся к самой концепции ... Прослушивание 80 или 443 на самом деле без проблем. Apache2 с радостью предоставил бы для этого элегантное решение, если бы не ... шифрование. Apache2 был разработан на C, и помимо потоков и вилок, он использует сокеты. В C для использования SSL требуется инициализация компонентов OpenSSL, а некоторые работают вокруг базового сокета для реализации всего SSL. Вы ищете простое решение, но весь механизм сложен ... Вот почему вы не можете включить SSL на базовом виртуальном хосте: HTTP и HTTP - это разные компоненты, и в способе Apache2, я боюсь, есть нет концепции наследования между первым и вторым.