Вопрос или проблема
Учитывая, что большинство людей используют HTTP/2.0 или HTTP/3, я подумал о внесении изменений в Apache, чтобы он отказывал в соединении тем, кто использует HTTP/1.0 или ниже.
Прежде чем предлагать mod_rewrite, я хочу применить настройки на гораздо более глубоком уровне, желательно через пользовательский модуль, чтобы меньше времени обработки тратилась на роботов, которые продолжают соединяться с сервером через HTTP/1.0.
Я посмотрел на директиву HttpProtocolOptions, но их документация предполагает, что я мог бы запретить HTTP/1.0 и выше, но мне нужно заблокировать HTTP/1.0, поскольку он не поддерживает keep-alives.
Так что я сделал свой собственный модуль и попробовал применить его с помощью директивы SetHandler, но он конфликтует с PHP, потому что у меня также есть AddHandler application/x-httpd-php .php. Под конфликтом я имею в виду, что я могу использовать либо модуль PHP, либо мой модуль. Я предпочел бы, чтобы мой модуль всегда запускался первым независимо от входящего запроса, а затем модуль php выполнялся после вызова php-файла.
Так что какой лучший способ мне это решить? Конечная цель – выдать ошибку, когда кто-либо подключается к любой веб-странице на сервере, используя протоколы HTTP/0.9 (или ниже) или HTTP/1.0, но те, кто использует HTTP/1.1 и выше, могут получить доступ к страницам.
Почему беспокоиться о пользовательском модуле?
Просто создайте виртуальный хост по умолчанию, и это поймает HTTP/1.0 (и я предполагаю HTTP/0.9 – но я не замечал ни одного из них) и вернет любую ошибку, которую вы хотите – а затем укажите виртуальный хост/виртуальные хосты для ваших настоящих хостов – то есть воспользуйтесь тем фактом, что HTTP/1.1 поддерживает виртуальные хосты на основе имен, но 1.0 и более ранние версии этого не делают.
Ответ или решение
Принудительное использование HTTP/1.1 и более новых версий на Apache: Полное руководство
В условиях современного веба переход на более новые версии протокола HTTP, такие как HTTP/2 и HTTP/3, становится вопросом приоритетной важности как для производительности, так и для безопасности. Это подстегивает администраторов серверов оптимизировать конфигурации для обеспечения совместимости с последними стандартами, одновременно отказываясь от устаревших протоколов, таких как HTTP/1.0 и ниже. В этом руководстве мы разберем, как можно настроить сервер Apache таким образом, чтобы он блокировал подключения, использующие HTTP/1.0 и старше, в пользу более современные версии, такие как HTTP/1.1 и HTTP/2.
Общее понимание проблемы
Подключения через HTTP/1.0 имеют свои ограничения, самые заметные из которых включают отсутствие поддержки keep-alive
, что увеличивает нагрузку на сервер при выполнении повторных запросов. Поэтому ваша цель состоит в том, чтобы отклонить запросы, поступающие по этому протоколу, тем самым освобождая ресурсы для более эффективной обработки запросов через HTTP/1.1 и выше.
Выбор подходящего метода
Хотя создание собственного модуля может показаться наиболее прямолинейным методом, на практике использование виртуальных хостов может предложить гораздо большее удобство без чрезмерных затрат на разработку. Ниже представлены основные шаги для реализации этой стратегии.
1. Настройка виртуальных хостов
Один из лучших способов управления запросами старых протоколов – это использование механизма виртуальных хостов в Apache. HTTP/1.1 поддерживает имя на основе виртуальных хостов, в то время как более ранние версии – нет. Это позволяет вам легко отклонять запросы на HTTP/1.0, так как они не соответствуют ни одному из именованных хостов.
# Конфигурация виртуального хоста для блокировки HTTP/1.0
<VirtualHost *:80>
ServerName block-http10.example.com
RewriteEngine On
RewriteCond %{THE_REQUEST} HTTP/1\.0
RewriteRule ^ - [R=403,L]
</VirtualHost>
# Конфигурация для вашего основного веб-сайта, который поддерживает более новые версии HTTP
<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /var/www/example
# Здесь добавьте любые дополнительные настройки
</VirtualHost>
2. Обработка запросов
Запросы, поступающие на первый виртуальный хост, автоматически блокируются (возвращая ошибку 403), если они используют HTTP/1.0. Виртуальный хост для вашего сайта будет принимать все запросы через HTTP/1.1 и выше, что позволит вам использовать PHP и другие модули, не столкнувшись с конфликта.
3. Активация модуля переадресации
Убедитесь, что модуль mod_rewrite
активирован, так как мы будем использовать его для обработки запросов. Вы можете активировать его с помощью команды:
a2enmod rewrite
Затем перезапустите сервер Apache:
service apache2 restart
4. Тестирование конфигурации
После настройки виртуальных хостов следует протестировать конфигурацию, используя инструменты, такие как curl
, чтобы убедиться, что сервер блокирует HTTP/1.0, но продолжает нормально обслуживать HTTP/1.1 и выше.
curl -I --http1.0 http://block-http10.example.com
# Ожидаемый ответ: HTTP/1.1 403 Forbidden
curl -I --http1.1 http://www.example.com
# Ожидаемый ответ: HTTP/1.1 200 OK
Заключение
Используя подход виртуальных хостов, вы не только решите задачу отклонения устаревших протоколов, но и сохраните контроль над обработкой запросов в вашем приложении на PHP и других модулях. Этот метод минимизирует задержки и снижает нагрузку на сервер, обеспечивая надежность и производительность вашего веб-приложения.