Domyślny serwer wirtualny Apache / Catch-All Virtual Host?


67

Jeśli mam 3 domeny: domain1.com, domain2.com i domain3.com, czy można skonfigurować domyślnego wirtualnego hosta dla domen, których nie ma na liście? Na przykład, gdybym miał:

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain1
ServerName domain1
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain2
ServerName domain2
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/everythingelse
ServerName *
ServerAlias host
</VirtualHost>

Jeśli zarejestrujesz domenę i skierujesz ją na mój serwer, domyślnie będzie to wszystko pokazywać to samo co domena3. Czy to jest możliwe?

Odpowiedzi:


45

Tak, to powinno działać, z wyjątkiem ServerAlias ​​powinno być „*”, z ServerName ustawioną na rzeczywistą nazwę hosta. Może być konieczne upewnienie się, że VirtualHost jest ostatnim załadowanym ...


Powinno działać, ale nie działa. Jeśli domeny nie ma na liście, pojawia się komunikat „Firefox nie może znaleźć serwera”.
SJaguar13,

2
Czy ustawiłeś go jako „HostName Server” i „ServerAlias ​​*”? Nie podkreśliłem tego wystarczająco oryginalnie, ale nazwa_serwera nie przyjmuje symboli wieloznacznych, a tylko nazwa serwera. NazwaSerwera musi być rzeczywistą nazwą hosta.
freiheit

Czy działają także inne wirtualne hosty? Jaka wersja apache?
freiheit

„Firefox nie może znaleźć serwera”. nie jest problemem apache. Potrzebujesz więcej szczegółów (z jakim serwerem się skontaktować, jaki jest kod błędu ...)
Law29

Dziwne, że to nie działa dla mnie, zawsze wybiera pierwszego wirtualnego hosta niezależnie od nagłówka hosta
jjxtra

80

Podczas korzystania z hostów wirtualnych opartych na nazwach, pierwsza załadowana konfiguracja hosta wirtualnego będzie domyślna (Źródło: Apache Wiki ). Na przykład przy konfiguracji poniżej, w przeciwnym razie niedopasowane domeny będą pasować do domain-one.com:

NameVirtualHost *:80

<VirtualHost *:80>
  ServerName domain-one.com
  # Other options and directives ..
</VirtualHost>

<VirtualHost *:80>
  ServerName domain-two.com
  # Other options and directives ..
</VirtualHost>

Wiele serwerów nie ma monolitycznego pliku konfiguracyjnego, ale kilka plików konfiguracyjnych specyficznych dla hosta jest zorganizowanych w następujący sposób:

/etc/apache2
|-- sites_available  (actual configuration files)
`-- sites_enabled    (symlinks to files in sites_available)

W takim przypadku, aby najpierw załadować konkretną konfigurację hosta wirtualnego, zmień nazwę dowiązania symbolicznego na coś, co będzie pierwsze podczas sortowania, np 00-default.


Niektóre inne odpowiedzi nie są całkiem poprawne. Według Wiki Apache, ustawienie ServerNamewirtualnego hosta jest nieprawidłowe. Jeśli host bez a ServerNamenie zostanie załadowany jako pierwszy, Apache może go nigdy nie użyć, ponieważ domyślnie załadowany byłby pierwszy host.

Co więcej, chociaż ServerAlias *rzeczywiście pasuje do wszystkiego, może również zastąpić inne hosty wirtualne zdefiniowane później. Być może to podejście zadziałałoby, gdyby zawsze był to ostatni wirtualny host, który ma zostać zdefiniowany (jak w konfiguracji podanej w pytaniu), ale oznacza to dodanie nowej dyrektywy i zmianę kolejności sortowania zamiast zmiany kolejności jak wyżej.


+ 1 milion internetów do ciebie Sir! Najpierw musi być domyślna.
Ryan

Czy wiesz, który z nich jest pierwszy, httpd.conf lub conf.d / xyz.conf?
Esa Varemo,

2
„Załadowana pierwsza konfiguracja hosta wirtualnego będzie domyślna” rozwiązał mój problem z lokalnymi domenami SSL na XAMPP (Windows). Wygląda na to, że Apache używa pierwszego vhosta jako domyślnego dla każdego portu, więc aby poprawnie obsługiwać niedopasowane domeny dla obu niezabezpieczonych / zabezpieczonych żądań, powinny istnieć 2 jawne „domyślne” konfiguracje dla portów 80/443 zdefiniowanych na początkuhttpd-vhosts.conf
Wirone

1
@EsaVaremo - httpd.conf zostanie załadowany jako pierwszy i będzie zawierał wiersz Uwzględnij, który zawiera źródła conf.d / xyz.conf (lub prawdopodobnie conf.d / *). każda konfiguracja (w tym vhosts) przed wierszem Dołącz zostanie przetworzona jako pierwsza; wszystko po przetworzeniu dołączonego pliku.
Dan Pritts

7

Nie podawaj nazwy serwera, a to stanie się Twoim domyślnym vhostem.

<VirtualHost *:80>
ServerAdmin webmaster@localhost

DocumentRoot /var/www
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>
</VirtualHost> 

Upewnij się także, że nie określono DocumentRoot w głównym pliku httpd.conf, ponieważ będzie to miało pierwszeństwo przed vhostami.


Mam to jako pierwszy wirtualny host na liście i nadal otrzymuję komunikat „Firefox nie może znaleźć serwera”.
SJaguar13,

2
Nie zgadzam się. Miałem pierwszy wirtualny host ustawiony bez nazwy serwera, jednak wydaje się, że jest on w konflikcie z niektórymi wirtualnymi hostami, ale nie z innymi. Rozwiązałem problem, dodając nazwę serwera, ale ustawiając go na losową domenę, która nie jest na moim serwerze. Ponieważ jest to pierwszy wirtualny host, jest używany jako domyślny, ale pasuje tylko wtedy, gdy używana jest domena niepasująca do żadnej innej nazwy serwera.
joshaidan

3

Kolejność jest ważna - przenieś swoją definicję vhosta do wszystkiego innego na początek listy.


2

Użyj wirtualnego hosta _default_ i umieść go najpierw w httpd-vhosts.conf, jak określono w http://httpd.apache.org/docs/2.2/vhosts/examples.html

„Łapanie każdego żądania na dowolny nieokreślony adres IP i port, tj. Kombinację adresu / portu, który nie jest używany dla żadnego innego wirtualnego hosta [...] Domyślny vhost nigdy nie obsługuje żądania wysłanego na adres / port, który jest używane dla vhostów opartych na nazwach. Jeśli żądanie zawierało nieznany nagłówek Host: lub nie było go, jest zawsze obsługiwane z podstawowego hosta opartego na nazwie (vhost dla tego adresu / portu pojawia się jako pierwszy w pliku konfiguracyjnym). "

Fragment z działającego, ale zaciemnionego httpd-vhosts.conf, który blokuje wszystkie vhosty do portu 80:

# Listen for virtual host requests on all IP addresses.
# This directive cannot be removed:
NameVirtualHost *:80

<VirtualHost _default_:80>
# This vhost catches client requests with host headers which have
# not been matched by ServerName or ServerAlias directives in other vhosts.
#
# We redirect all such requests to a particular named vhost:
    RewriteCond %{HTTP_HOST}    ^(.*)$
    RewriteRule ^(.*)$  http://my.site.of.choice [R=permanent,L]
</VirtualHost>

# Name based vhosts here:
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName  my.other.site
    ServerAlias my.other.site2 my.other.site3
</VirtualHost>

# more vhosts etc...

Szczegółowe wyjaśnienie procesu dopasowywania vhosta można znaleźć tutaj: http://httpd.apache.org/docs/2.2/vhosts/details.html


2
_default_jest używany tylko w przypadku niepasujących adresów IP , więc jeśli masz vhost (*: 80) ze znakiem wieloznacznym, nigdy nie będzie używany.
Wirone

2

Symbole wieloznaczne obejmują pliki konfiguracji witryny:

Include path/to/site/confs/*httpd.conf

Uporządkuj pliki konf. Witryny, aby były ładowane w oczekiwanej kolejności. Przykład...

01-httpd.conf

02-site1-httpd.conf

03-site2-httpd.conf

itp...

Apache odczyta je w kolejności. Następnie utwórz taki, który zawsze ładuje się jako ostatni, aby złapać niedopasowane hosty wirtualne i zwrócić 404 zamiast ładowania domyślnej witryny.

99-catchall-httpd.conf

<VirtualHost *:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost *:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

Porty należy zastąpić portami, na których nasłuchuje httpd. Lub jeśli masz httpd nasłuchujący na określonych interfejsach, musisz dodać catchall dla każdego interfejsu, w ten sposób:

<VirtualHost 192.168.1.101:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>
<VirtualHost 192.168.1.101:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

Mam nadzieję że to pomoże. Korzystam z tej metody, aby ładować witryny w określonej przeze mnie kolejności i zapobiegać niezamierzonemu ładowaniu nieoczekiwanych hostów wirtualnych.


1

Najlepszym rozwiązaniem jest zmiana nazwy pliku konfiguracyjnego witryny zaczynającego się od „1”, aby załadował się pierwszy i będzie to domyślna witryna.

Apache2 ustawia pierwszy załadowany plik vhost jako stronę domyślną.


000-defaultz tego powodu domyślna instalacja apache ma również hosta wirtualnego.
vp_arth,

0

podczas używania <VirtualHost *:port>i określania ServerName / ServerAlias ​​dla hostów, na których ci zależy, to właśnie musiałem zrobić.

Trochę tła w mojej sytuacji:

Mam dynamiczny adres IP od mojego usługodawcy internetowego, więc mój adres IP jest zarejestrowany w firmie rejestrującej dynamiczny adres IP (w moim przypadku noip.org). Jeden z moich „hostów” musiał zostać zarejestrowany podczas mojej rejestracji DNS jako myabc.example.com jako CNAME, co wskazuje na host1.ddns.net. Ale host2.ddns.net został bez zmian. Chciałem, aby myabc.example.com i host1.ddns.net poszły na stronę 1 i host2.ddns.net, aby przejść na stronę 2 i wszystko inne, w tym mój adres IP, aby przejść do wartości domyślnej.

Pierwszy plik conf odczytu będzie domyślnym, czyli 000_def.conf, 001_site1.conf, 002_site2.confzostanie odczytany w tej kolejności ze 000_def.confjako domyślnej witryny. (uwaga: w moim przypadku mam te „pliki”, w /etc/apache2/sites-enabledktórych faktycznie znajdują się dynamiczne linki do właściwego pliku conf /etc/apache2/sites-available)

Ponieważ nazwa_serwera jest używana w 001_site1.conf i 002_site2.conf, należy również ustawić na coś w 000_def.conf.

# 000_def.conf:
<VirtualHost *:80>  
ServerName null
# NOTE: DO NOT USE "ServerAlias *" this seems to override the other conf files.
</VirtualHost>


# 001_site1.conf
<VirtualHost *:80>  
ServerName myabc.example.com
ServerAlias mylocalhostname host1.ddns.net
</VirtualHost>


# 002_site2.conf:
<VirtualHost *:80>  
ServerName host2.ddns.net
</VirtualHost>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.