Вопрос или проблема
В apache2 по умолчанию любой http-запрос с неизвестным хостом будет направлен на первый загруженный VirtualHost. Есть ли способ отключить эту функцию? Иначе говоря, я хочу иметь веб-сервер, на котором пользователь может получать доступ только к явно названным определениям VirtualHost. Любое другое имя хоста, не упомянутое явно в строках ServerName или ServerAlias, должно быть тихо игнорировано.
Это возможно?
Listen 80
NameVirtualHost *
<VirtualHost _default_:*>
# Все, что соответствует этому хосту, должно быть тихо игнорировано.
</VirtualHost>
<VirtualHost *>
DocumentRoot /www/example1
ServerName www.example.com
</VirtualHost>
<VirtualHost *>
DocumentRoot /www/example2
ServerName www.example.org
</VirtualHost>
Обновление: Как было предложено ниже и в других местах, тихое игнорирование запроса может быть не лучшей идеей и, возможно, нарушает RFC для HTTP. Однако, поскольку виртуальные хосты предназначены для симуляции нескольких отдельных физических HTTP-серверов, подход тихого игнорирования не кажется мне неразумным. Это было бы то же самое, что и виртуальный хостинг на основе IP и блокирование некоторых IP (возможно, не для всех клиентов).
Я не уверен, что “тихое падение” — хорошая идея. Вы должны дать клиенту хотя бы некоторое указание на то, что произошло. Возможно, вы могли бы отправить http 410 “gone” ошибку. Что-то вроде этого должно сработать:
RewriteRule ^.*$ - [G]
Кроме того, вы должны иметь возможность указать пользовательский документ ошибки 410, которым может быть просто пустая HTML-страница.
Вот альтернативный способ, который не включает правила переписывания:
<VirtualHost _default_:*>
<Location />
Deny from all
Options None
ErrorDocument 403 Forbidden.
</Location>
</VirtualHost>
это сработало для меня
<VirtualHost x.x.x.x:80 [x:x::x:x:x:x]:80>
ServerName myactualservername.com
ServerAlias *
<Location />
Deny from all
Options None
ErrorDocument 403 Forbidden.
</Location>
</VirtualHost>
замените x.x.x.x на ваш фактический ipv4 и ipv6
замените myactualservername.com на фактический сайт, обслуживаемый машиной
я использую виртуальный хостинг на основе имени.
благодарность за это решение
https://serverfault.com/a/82309/459796
Я попробовал все другие ответы, перечисленные здесь, и они не были эффективны в предотвращении запросов по IP.
Вместо этого я решил по умолчанию запрещать все (Require all denied
и ничего больше как ваша модель безопасности по умолчанию) и явно включать в белый список домены.
<VirtualHost my.domain.com:443>
Я хостирую несколько виртуальных сайтов, и как вы сказали, я также не хочу никаких ответов по IP-адресам, на которых у меня нет фактического сайта. Я изменил свой файл /etc/apache2/ports.conf, закомментировав существующие строки Listen на портах 80 и 443, и теперь слушаю ТОЛЬКО на желаемых IP и портах. (В качестве предосторожности я закомментировал то, что было до моего изменения, чтобы я мог легко вернуть обратно, если возникнет проблема с этим)
#закомментировал Listen 80, не связанный с конкретным IP
#Listen 80
# Повторил Listen для портов 80 и 443 для каждого сайта, который я хостирую.
Listen xxx.xxx.xxx.xxx:80
Listen xxx.xxx.xxx.xxx:443
#закомментировал Listen 443, не связанный с конкретным IP
#<IfModule ssl_module>
# Listen 443
#</IfModule>
#<IfModule mod_gnutls.c>
# Listen 443
#</IfModule>
Ответ или решение
Чтобы отключить поведение по умолчанию виртуального хоста в Apache2, когда запросы с неизвестным заголовком Host перенаправляются к первому загруженному виртуальному хосту, вы можете использовать несколько подходов. Ниже представлены методы, которые помогут вам настроить сервер таким образом, чтобы он обрабатывал только явно заданные виртуальные хосты и игнорировал остальные.
Метод 1: Использование виртуального хоста по умолчанию
Самый простой способ — создать виртуальный хост по умолчанию, который будет отклонять все ненужные запросы. Вот пример конфигурации:
<VirtualHost _default_:*>
<Location />
Require all denied
ErrorDocument 403 "Доступ запрещён."
</Location>
</VirtualHost>
Этот виртуальный хост будет принимать все запросы, которые не соответствуют другим явно заданным виртуальным хостам, и возвращать ошибку 403 (с доступом запрещён), когда запрос не соответствует ни одному из определённых имён.
Метод 2: Отключение по умолчанию с использованием Rewrite
Вы также можете использовать правила перенаправления для возврата кода состояния HTTP 410 (устаревший). Например:
<VirtualHost _default_:*>
RewriteEngine On
RewriteRule ^.*$ - [G]
</VirtualHost>
Это правило означает, что любые запросы не соответствующие ни одному из существующих виртуальных хостов будут возвращать статус 410 "Gone".
Метод 3: Настройка IPv4 и IPv6
Поскольку вы хотите полностью игнорировать запросы, которые не соответствуют явно заданным виртуальным хостам, убедитесь, что ваш сервер слушает только на конкретных IP-адресах. Для этого откройте файл /etc/apache2/ports.conf
и укажите необходимые IP-адреса:
# Удалите или закомментируйте строки с Listen
# Listen 80
# Listen 443
# Добавьте конкретные IP-адреса
Listen xxx.xxx.xxx.xxx:80
Listen xxx.xxx.xxx.xxx:443
Замените xxx.xxx.xxx.xxx
на ваши реальные IP-адреса. Это гарантирует, что только запросы, идущие на эти IP и соответствующие заданным виртуальным хостам, будут обрабатываться.
Метод 4: Ограничение доступа по доменам
Вы можете также побороть нежелательные запросы, ограничив доступ к серверу по доменам. Например:
<VirtualHost my.domain.com:80>
ServerName my.domain.com
DocumentRoot /var/www/mydomain
</VirtualHost>
<VirtualHost *:80>
ServerName other.domain.com
DocumentRoot /var/www/otherdomain
</VirtualHost>
<VirtualHost *:80>
ServerName default.domain.com
<Location />
Require all denied
</Location>
</VirtualHost>
Заключение
Каждый из предложенных методов позволит вам достичь цели запрета на обработку запросов, которые не соответствуют явно определённым виртуальным хостам. Однако выбор подхода зависит от ваших конкретных целей и требований к конфиденциальности и безопасности вашего веб-сервера.