Я думал, что следую общепринятой мудрости в перенаправлении HTTP-трафика на HTTPS, но после сегодняшней проблемы с DNS и необходимости использовать IP-адрес вместо URL-адреса я понял, что что-то не так.
Apache.conf:
<VirtualHost *:80>
ServerName 127.0.0.1
DocumentRoot /var/www/web
</VirtualHost>
<VirtualHost _default_:443>
ServerName example.com
DocumentRoot /var/www/web
SSLEngine On
SSLCertificateFile /etc/ssl/local_certs/example.com.pem
SSLCertificateKeyFile /etc/ssl/local_certs/example.com.pem.key
Header set Access-Control-Allow-Origin "*"
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
Redirect permanent "/" "https://example.com/"
</VirtualHost>
Учитывая вышесказанное, меня смущают несколько моментов:
1) Если сейчас мы используем IP-адрес, почему какой-либо из указанных выше виртуальных хостов ServerName обслуживает страницу? Это меня меньше смутило бы, если бы IP-адрес, который я использую в настоящее время, соответствовал имени домена (должно, но сегодня это не так, проблема с DNS).
2) Учитывая, что IP-адрес, который я использую, не 127.0.0.1, почему мне разрешен доступ через порт 80?
Чтобы объяснить хост 127.0.0.1, это удобство для локального репозитория apt. Я знаю, что ServerName не на 100% безопасен, но это не является непосредственной проблемой.
Что происходит, когда я захожу на сайт по IP:
В первую очередь меня перенаправляют на HTTPS с того же IP-адреса, чего я и ожидал. Но если я вернусь в адресную строку в браузере и удалю 's' из https, он переместит меня на страницу через порт 80 без перенаправления, и я могу продолжить просмотр сайта без защиты.
Я должен добавить, что готовые файлы конфигурации сайта с включенными / доступными настройками все еще существуют, но они имеют корень документа / var / www / html, который не содержит ничего, кроме целевой страницы apache index.html по умолчанию, это не то, что мне подают.
Цитата из документация:
Если совпадение ServerName или ServerAlias не найдено в наборе виртуальных хостов, содержащих наиболее конкретную совпадающую комбинацию IP-адреса и порта, тогда первый указанный виртуальный хост что соответствует, что будет использоваться.
(выделено не мной).
Другими словами, Apache всегда будет использовать один из VirtualHosts, даже если ни один из настроенных VirtualHosts не соответствует точно. Отсутствие настройки адреса не означает, что адрес не является серверным содержимым.
(Примечание: только после публикации я понял, что вопрос помечен как apache-2.2, но документация 2.2 содержит практически идентичный абзац).
2) Учитывая, что IP-адрес, который я использую, не 127.0.0.1, почему мне разрешен доступ через порт 80?
Потому что вы не привязываете / не ограничиваете Apache httpd конкретно к интерфейсу обратной связи и слушаете все интерфейсы.
У тебя наверное есть Listen 80
директива в другом месте вашего httpd.conf, которая позволяет Apache принимать трафик на порт 80 на всех интерфейсах. (Вероятно, вы захотите сохранить это, чтобы иметь возможность продолжать перенаправлять с HTTP на HTTPS на своих веб-сайтах, выходящих в Интернет).
Дополнительно вы используете <VirtualHost *:80>
в определениях вашего виртуального хоста. Это делает их действительными на всех интерфейсах / IP-адресах. Как уже Джеральд Скнайдер объяснил это затем делает первую запись VirtualHost по умолчанию, которая будет обрабатывать все запросы, не соответствующие ни одной из ваших других записей VirtualHost.
Ваш вариант использования является хорошим примером того, когда использовать более конкретные определения VirtualHost на основе IP, которые будут более предсказуемо вести себя так, как вы их намеревались:
<VirtualHost 127.0.0.1:80>
ServerName 127.0.0.1
DocumentRoot /var/www/web
</VirtualHost>
<VirtualHost example.com:80>
ServerName example.com
Redirect permanent "/" "https://example.com/"
</VirtualHost>