Як відключити VirtualHost за замовчуванням в apache2?


10

У дизайні apache2 будь-який http-запит з невідомим хостом буде спрямований на перший завантажений VirtualHost. Чи є спосіб відключити цю функцію? Інакше сказано, я хочу мати веб-сервер, на якому користувач може отримати лише чітко названі визначення VirtualHost. Будь-яке інше ім’я хоста, яке прямо не вказано в рядку ServerName або ServerAlias, слід мовчки ігнорувати.

Чи можливо це?

Listen 80
NameVirtualHost *

<VirtualHost _default_:*>
# Anything matching this host should be silently ignored.
</VirtualHost>

<VirtualHost *>
DocumentRoot /www/example1
ServerName www.example.com
</VirtualHost>

<VirtualHost *>
DocumentRoot /www/example2
ServerName www.example.org
</VirtualHost>

Оновлення: Як запропоновано нижче та в інших місцях, мовчання ігнорування запиту може бути не дуже хорошою ідеєю і, можливо, порушує RFC для HTTP. Однак, оскільки віртуальні хости призначені для імітації декількох окремих фізичних серверів HTTP, підхід беззвучного ігнорування не здається мені розумним. Це було б так само, як віртуальний хостинг на основі IP та брандмауер відключення деяких IP-адрес (можливо, не для всіх клієнтів).

Відповіді:


4

Я не впевнений, що "мовчки не вдається" - це гарна ідея. Ви повинні дати клієнту хоча б деяку вказівку на те, що сталося. Можливо, ви можете надіслати помилку http 410 "пропало". Щось подібне повинно зробити трюк:

RewriteRule ^.*$ - [G]

Крім того, ви повинні мати можливість вказати спеціальний документ про помилку 410, який може бути просто порожньою html-сторінкою.


Я також знайшов це рішення самостійно. Ви повинні додати рядки для завантаження mod_rewrite та "RewriteEngine On", зазначивши, що вони можуть не знадобитися. Вони були для мене. :)
Харві

2
Крім того, оскільки ми просто говоримо "Зникли чи заборонено", і що ще важливіше, "-" запобігає заміні, регулярний вираз може бути набагато простішим:RewriteRule . - [F]
Харві

17

Ось альтернативний спосіб, який не передбачає переписання правил:

<VirtualHost _default_:*>
    <Location />
        Deny from all
        Options None
        ErrorDocument 403 Forbidden.
    </Location>
</VirtualHost>

2
Це має бути прийнятим рішенням. +1
Грег Шміт

Мені не зрозуміло це рішення. У мене є кілька файлів VHOST, і чи просто я роблю новий із цим у ньому? Я спробував це, і я назвав файл 001.default.conf, але я все ще переспрямовував свої субдомени.
Frantumn

@Frantumn Як зазначено у запитанні, "будь-який http-запит з невідомим хостом буде спрямований на перший завантажений VirtualHost ". Отже, цей "типовий" <VirtualHost>повинен бути визначений спочатку в конфігурації сервера. Саме той файл, який повинен бути, залежить від вашої конфігурації. (Однак проблема з "перенаправленими субдоменами" може бути непов'язаною проблемою.)
MrWhite

Ага. Використовуючи інші домени, які вказують на мій сервер, він не робить 403, він просто вибирає перший знайдений віртуальний хост, хоча ім'я сервера не відповідає
jjxtra

1

це працювало для мене

<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>

замініть xxxx фактичним ipv4 та ipv6
замініть myactualservername.com фактичним веб-сайтом, який обслуговує машина

Я використовую віртуальний хост на основі імен.
заслуга цього рішення припадає на
https://serverfault.com/a/82309/459796

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.