Vraag Apache standaard / catch-all virtuele host?


Als ik drie domeinen heb, domain1.com, domain2.com en domain3.com, is het dan mogelijk om een ​​standaard virtuele host in te stellen voor niet-vermelde domeinen? Bijvoorbeeld, als ik zou hebben:

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

Als u een domein registreert en dit naar mijn server verwijst, zou het standaard alles tonen dat hetzelfde weergeeft als domain3. Is dat mogelijk?


65
2017-11-06 18:36


oorsprong




antwoorden:


Ja, dat zou moeten werken, behalve dat ServerAlias ​​"*" zou moeten zijn, met ServerName ingesteld op een echte hostnaam. U moet mogelijk ervoor zorgen dat VirtualHost de allerlaatste is geladen ...


44
2017-11-06 18:40



Het zou moeten werken, maar doet dat niet. Als een domein niet specifiek wordt vermeld, krijg ik "Firefox kan de server niet vinden". - SJaguar13
Heb je het ingesteld als "Servernaam host" en "ServerAlias ​​*"? Ik heb dit aanvankelijk niet genoeg benadrukt, maar ServerName neemt geen jokertekens, alleen ServerAlias ​​doet dat. Servernaam moet een echte hostnaam zijn. - freiheit
Werken de andere virtualhosts ook? Welke versie van apache? - freiheit
"Firefox kan de server niet vinden." is geen apache-probleem. U heeft meer details nodig (welke server wordt gecontacteerd, wat is de foutcode ...) - Law29


Bij gebruik van op naam gebaseerde virtuele hosts, de eerste virtuele host geladen configuratie is de standaard (Bron: Apache Wiki). Bijvoorbeeld met de onderstaande configuratie, anders niet-overeenkomende domeinen zal matchen met 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>

Veel servers hebben geen monolithisch configuratiebestand, maar wel verschillende host-specifieke configuratiebestanden als volgt georganiseerd:

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

In dit geval, om een ​​bepaalde virtuele hostconfiguratie te laden hernoem eerst de symlink naar iets dat als eerste komt gesorteerd, zoals 00-default.


Sommige van de andere antwoorden zijn niet helemaal correct. Volgens de Apache Wiki, niet instellen a ServerName in een virtuele host is niet correct. Als de host zonder een ServerName wordt niet als eerste geladen, Apache kan het zelfs nooit gebruiken, omdat de eerste geladen host zou zijn de standaard.

Verder, terwijl ServerAlias * komt inderdaad overeen met alles, misschien overschrijven ook andere virtuele gastheren die later worden gedefinieerd. Misschien deze benadering zou werken als het altijd de laatste virtuele host die moet worden gedefinieerd (zoals in de configuratie gegeven in de vraag), maar dit betekent een nieuw toevoegen richtlijn en de sorteervolgorde wijzigen in plaats van alleen de bestellen zoals hierboven.


76
2018-03-26 23:06



+ 1 miljoen internets voor jou Heer! Het moet de eerste zijn om standaard te zijn. - Ryan
Weet je welke eerst komt, httpd.conf of conf.d / xyz.conf? - Esa Varemo
+ 2 miljoen internets, dank u meneer. - Ben Everard
"de eerste geladen virtuele hostconfiguratie is de standaard" loste mijn probleem met lokale SSL-domeinen op XAMPP (Windows) op. Het lijkt erop dat Apache de eerste vhost als standaard gebruikt voor elke poort, dus om de niet-overeenkomende domeinen voor zowel onbeveiligde als beveiligde verzoeken op de juiste manier te behandelen, moeten er twee expliciete "standaard" -configs zijn voor 80/443-poorten die aan het begin zijn gedefinieerd. httpd-vhosts.conf - Wirone
@EsaVaremo - httpd.conf wordt als eerste geladen en het bevat een Include-regel die conf.d / xyz.conf (of waarschijnlijk conf.d / *) gebruikt. elke config (inclusief vhosts) voordat de Include-regel als eerste wordt verwerkt; alles nadat de include-regel is verwerkt na de opgenomen bestanden. - Dan Pritts


Geef geen servernaam op, en dat wordt uw standaardvhost.

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

Zorg er ook voor dat u geen DocumentRoot hebt opgegeven in het hoofdbestand httpd.conf, omdat dat voorrang heeft boven de vhosts.


7
2017-11-07 00:32



Ik heb dat als de eerste virtuele host vermeld, en ik krijg nog steeds "Firefox kan de server niet vinden". - SJaguar13
Ben ik het niet mee eens. Ik had mijn eerste virtuele host ingesteld zonder een servernaam, maar het lijkt te conflicteren met sommige virtuele hosts, maar niet met andere. Ik loste het probleem op door een servernaam toe te voegen, maar het in te stellen op een willekeurig domein dat niet op mijn server staat. Aangezien dit de eerste virtuele host is, wordt deze als standaard gebruikt, maar komt alleen overeen wanneer een domein dat niet overeenkomt met een andere servernaam wordt gebruikt. - joshaidan


Order is belangrijk - verplaats je vhostdefinitie voor al het andere naar de kop van de lijst.


3
2017-11-07 01:07





Gebruik de virtuele host _default_ en plaats deze eerst in httpd-vhosts.conf zoals aangegeven in http://httpd.apache.org/docs/2.2/vhosts/examples.html

"Het verzamelen van elke aanvraag voor een niet-gespecificeerd IP-adres en poort, dat wil zeggen een adres / poort-combinatie die niet wordt gebruikt voor een andere virtuele host [...] Een standaard vhost dient nooit een verzoek dat naar een adres / poort is verzonden gebruikt voor op naam gebaseerde vhosts. Als de aanvraag een onbekende of geen host: header bevat, wordt deze altijd weergegeven via de primaire naamgebaseerde vhost (de vhost voor dat adres / poort die als eerste in het configuratiebestand verschijnt). "

Snippet van een live maar versluierde httpd-vhosts.conf die gebeurt om alle vhosts te vergrendelen op poort 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...

Een uitgebreide uitleg van het vhost-matchingproces is hier te vinden: http://httpd.apache.org/docs/2.2/vhosts/details.html


2
2017-11-13 16:03



_default_ wordt alleen gebruikt voor niet-overeenkomende IPs, dus als u vhost (*: 80) met een wildcard gebruikt, zal deze nooit worden gebruikt. - Wirone


Wildcard bevat uw siteconfiguratiebestanden:

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

Organiseer de conf-bestanden van uw site zodat deze in een verwachte volgorde worden geladen. Voorbeeld...

01-httpd.conf

02-site1-httpd.conf

03-site2-httpd.conf

enz...

Apache zal deze in volgorde lezen. Maak er vervolgens een die altijd als laatste wordt geladen om ongeëvenaarde virtuele hosts te vangen en een 404 terug te sturen in plaats van een standaardsite te laden.

99-catchall-httpd.conf-

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

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

Zorg ervoor dat u de poorten vervangt door de poorten waarop uw httpd luistert. Of als je op bepaalde interfaces naar httpd luistert, moet je in plaats daarvan een catchall voor elke interface toevoegen, zoals:

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

Ik hoop dat dit helpt. Ik gebruik deze methode om sites te laden in de volgorde die ik opgeeft en om te voorkomen dat ongeëvenaarde virtuele hosts onverwacht een onverwachte site laden.


2
2018-05-25 16:50





De beste oplossing is om het siteconfiguratiebestand te hernoemen beginnend met een "1" zodat het eerst wordt geladen en dat zal uw standaardsite zijn.

Apache2 maakt het eerste geladen vhost-bestand als de standaardpagina.


1
2017-11-13 11:02



standaard apache-installatie heeft ook 000-default virtuele host om deze reden. - vp_arth


tijdens gebruik <VirtualHost *:port> en specificeren ServerName / ServerAlias ​​voor de hosts waar je om geeft, en dat is wat ik moest doen.

Een beetje achtergrond in mijn situatie:

Ik heb een dynamisch IP-adres van mijn ISP, dus mijn IP-adres is geregistreerd bij een dynamisch IP-adresregistratiebedrijf (noip.org in mijn geval). Een van mijn "hosts" moest worden geregistreerd bij mijn DNS-registratie als myabc.example.com als een CNAME die verwijst naar host1.ddns.net. Maar host2.ddns.net bleef zoals het was. Ik wilde myabc.example.com en host1.ddns.net gebruiken om naar site1 en host2.ddns.net te gaan om naar site 2 te gaan en naar iets anders, inclusief mijn IP-adres, om naar de standaard te gaan.

De eerste gelezen conf-bestand is de standaard, d.w.z. 000_def.conf, 001_site1.conf, 002_site2.conf zal in die volgorde worden gelezen met 000_def.conf als de standaardsite. (Opmerking: in mijn geval heb ik deze "bestanden" in /etc/apache2/sites-enabled die in feite dynamische links naar het daadwerkelijke conf-bestand zijn /etc/apache2/sites-available)

Omdat ServerName wordt gebruikt in 001_site1.conf en 002_site2.conf, moet deze ook worden ingesteld op iets in 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>

0
2018-03-06 01:42