У меня есть один экземпляр httpd Apache 2.0, в котором я хотел бы разместить как HTTP, так и HTTPS. У них один и тот же IP-адрес, и HTTP будет поступать на порт 80, а HTTPS - на порт 443 (стандартный). У меня есть 2 домена www.example.com и secure.example.com, которые оба указывают на этот IP-адрес.
Теперь проблема: мне нужен только HTTP-трафик на www.example.com и только HTTPS-трафик на secure.example.com. Это означает отсутствие HTTPS для www.example.com и HTTP для secure.example.com.
Мой httpd.conf выглядит как
ServerName www.example.com
Listen 10.0.0.1:80
Listen 10.0.0.1:443
NameVirtualHost 10.0.0.1:80
NameVirtualHost 10.0.0.1:443
<VirtualHost 10.0.0.1:80>
ServerName www.example.com
</VirtualHost>
<VirtualHost 10.0.0.1:443>
ServerName secure.example.com
SSLEnable # ... and other SSL stuff
</VirtualHost>
Сейчас происходит то, что я могу получить доступ к обоим доменным именам, используя как HTTP, так и HTTPS. Я искал виртуальный хостинг на основе портов и виртуальный хостинг на основе имен, и мне кажется, что то, что у меня есть, должно работать. Я не пытаюсь разместить несколько доменов в SSL, поэтому проблем нет. Я просто хочу, чтобы пользователю было запрещено переходить на www.example.com с использованием HTTPS и наоборот для secure.example.com.
Возможно ли это без отдельного псевдонима IP?
Решить HTTP для secure.example.com просто. Вы просто создаете дополнительный виртуальный хост для перехода на HTTPS:
<VirutalHost 10.0.0.1:80>
ServerName secure.example.com
Redirect / https://secure.example.com/
</VirtualHost>
Решить HTTPS на www.example.com сложнее. Проблема в том, что обычно вы не можете создать виртуальный хостинг на основе имени с HTTPS. Причина в том, что SSL-соединение устанавливается до того, как Apache узнает, к какому хосту вы пытаетесь подключиться, поэтому не знает, какой SSL-сертификат отправить, поэтому должен отправить первый, о котором он знает. В результате, если вы попытаетесь использовать SSL на основе имени, вам будет отправлен неправильный сертификат на каждый виртуальный хост, кроме одного, и браузер отобразит ошибку для пользователя. Вы можете обойти это, используя подстановочный сертификат для * .example.com или используя сертификат с альтернативным именем субъекта. К сожалению, эти сертификаты стоят дороже, и вы можете найти поддержку у более малоизвестных клиентов.
Вы можете добавить виртуальный хост для HTTPS, аналогичный тому, что вы делали с HTTP:
<VirtualHost 10.0.0.1:443>
ServerName www.example.com
Redirect / http://www.example.com/
</VirtualHost>
Если вы решили проблему с SSL, это будет работать без ошибок. Если вы этого не сделали, то клиент должен получить сообщение об ошибке о том, что имя хоста не соответствует сертификату, но затем должен перенаправить на http.
Я бы просто добавил новые виртуальные хосты с редиректами
<VirtualHost 10.0.0.1:443>
ServerName www.example.com
Redirect / https://secure.example.com/
</VirtualHost>
<VirutalHost 10.0.0.1:80>
ServerName secure.example.com
Redirect / http://www.example.com/
</VirtualHost>