Come disabilitare VirtualHost predefinito in apache2?


10

In apache2 in base alla progettazione, qualsiasi richiesta http con un host sconosciuto verrà indirizzata al primo VirtualHost caricato. C'è un modo per disabilitare questa funzione? Detto diversamente, desidero disporre di un server Web in cui l'utente può solo arrivare a definizioni VirtualHost esplicitamente denominate. Qualsiasi altro nome host non esplicitamente menzionato in una riga ServerName o ServerAlias ​​deve essere ignorato silenziosamente.

È possibile?

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>

Aggiornamento: come suggerito di seguito e altrove, ignorare in silenzio una richiesta potrebbe non essere una buona idea e forse rompe gli RFC per HTTP. Tuttavia, poiché gli host virtuali sono progettati per simulare più server HTTP fisici separati, l'approccio di ignoramento silenzioso non mi sembra irragionevole. Sarebbe lo stesso dell'hosting virtuale basato su IP e del firewall su alcuni degli IP (forse non per tutti i client).

Risposte:


4

Non sono sicuro che il "fallimento silenzioso" sia una buona idea. Dovresti dare al cliente almeno qualche indicazione su cosa è successo. Forse potresti inviare un errore http 410 "sparito". Qualcosa del genere dovrebbe fare il trucco:

RewriteRule ^.*$ - [G]

Inoltre, dovresti essere in grado di specificare un documento di errore 410 personalizzato, che potrebbe essere solo una pagina html vuota.


Ho finito per scoprire questa soluzione anche da solo. Dovresti aggiungere delle righe per caricare mod_rewrite e "RewriteEngine On" notando che potrebbero non essere necessari. Erano per me. :)
Harvey,

2
Inoltre, poiché stiamo solo dicendo Andato o Vietato e, cosa più importante, il "-" impedisce la sostituzione, il regex può essere molto più semplice:RewriteRule . - [F]
Harvey,

17

Ecco un modo alternativo che non prevede regole di riscrittura:

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

2
Questa dovrebbe essere la soluzione accettata. +1
Greg Schmit

Non sono chiaro su questa soluzione. Ho diversi file VHOST e ne faccio uno nuovo con questo? Ci ho provato e ho chiamato il file 001.default.conf ma ho ancora la regia dei miei sottodomini.
Frantumn,

@Frantumn Come indicato nella domanda, "qualsiasi richiesta http con un host sconosciuto verrà indirizzata al primo VirtualHost caricato ". Questo "default" <VirtualHost>deve quindi essere definito per primo nella configurazione del server. Il file che deve trovarsi dipende esattamente dalla tua configurazione. (Tuttavia, il problema dei "sottodomini reindirizzati" potrebbe essere un problema non correlato.)
MrWhite,

Huh. Quando si usano altri domini che puntano al mio server, non fa il 403, seleziona solo il primo virtualhost che trova, anche se il nomeserver non è una corrispondenza
jjxtra

1

questo ha funzionato per me

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

sostituisci xxxx con il tuo reale ipv4 e ipv6
sostituisci myactualservername.com con un sito web reale fornito dalla macchina

sto usando un host virtuale basato sul nome.
credito per questa soluzione va a
https://serverfault.com/a/82309/459796

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.