Perché Apache potrebbe ignorare un host virtuale con un ServerName corrispondente all'URL richiesto?


26

Sto cercando di aggiungere un secondo host virtuale alla mia configurazione di apache, ma non riesco a ottenere il nuovo host virtuale da utilizzare.

Il mio httpd.confcontiene solo la seguente riga:

ServerName radiofreebrighton.org.uk

Ho anche un ports.conffile che contiene quanto segue:

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    Listen 443
</IfModule>

Ho due file sites-availableche sono stati collegato simbolicamente a sites-enabledda a2ensite:

  • radiofreebrighton.org.uk
  • trafalgararches.co.uk

Il contenuto del primo è:

<VirtualHost _default_:80>
    DocumentRoot /home/tom/www

    ServerAdmin tom@radiofreebrighton.org.uk
    ServerName radiofreebrighton.org.uk
    ServerAlias www.radiofreebrighton.org.uk

    <Directory /home/tom/www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log
    LogLevel error
    CustomLog /var/log/apache2/access.log combined

    Alias /wiki /home/tom/www/mediawiki/index.php
</VirtualHost>

Il contenuto di quest'ultimo è:

<VirtualHost *:80>
    DocumentRoot /home/tom/tata-www

    ServerAdmin admin@trafalgararches.co.uk
    ServerName trafalgararches.co.uk
    ServerAlias www.trafalgararches.co.uk

    <Directory /home/tom/tata-www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    logLevel error
    ErrorLog /var/log/apache2/error.log
</VirtualHost>

Ma ogni volta che richiedo una pagina da trafalgararches.co.uk, mi viene data una pagina da radiofreebrighton.org.uk. Perché potrebbe succedere questo? Come posso ripararlo?


Modificare:

Configurazione dell'host virtuale come inteso da apache:

tom@rfb:/usr/local$ apache2ctl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server radiofreebrighton.org.uk (/etc/apache2/sites-enabled/radiofreebrighton.org.uk:1)
         port 80 namevhost radiofreebrighton.org.uk (/etc/apache2/sites-enabled/radiofreebrighton.org.uk:1)
         port 80 namevhost trafalgararches.co.uk (/etc/apache2/sites-enabled/trafalgararches.co.uk:1)
Syntax OK

(Raccolto via apache2ctl -Saka httpd -S.)


1
Non sono sicuro che questa sia la causa, ma dovresti rimuovere le barre dalle estremità del tuo ServerNamee delle ServerAliaslinee. Inoltre, assicurati di aver riavviato apache.
SEE

Sono quasi sicuro che sia la causa. Significa che il nome host nella richiesta non corrisponderà mai al ServerName per quell'host virtuale.
Larks

1
@ErikA, @larsks - Ragazzi, ho avuto le mie speranze! Ho rimosso le barre finali e ho riavviato apache, ma non ha cambiato nulla.
Tom Wright,

1
Hai un NameVirtualHost *:80posto nella tua configurazione?
Larks

1
Non sono sicuro che i siti di cui sopra siano di produzione o sviluppo, ma effettivamente andare a quegli URL mi dà due pagine diverse (pagine corrette dall'aspetto di esso). Se i vhosts sopra sono su un server di sviluppo, ignora questo commento. Altrimenti, potresti aver risolto il problema da qualche parte lungo la strada e avere ancora una copia cache in giro.
cyberx86,

Risposte:


15

Bene, questa domanda ha più di un anno, ma mi sono imbattuto in un simile "problema". Questo può essere ovvio, ma non dimenticare di riavviare il servizio apache dopo aver abilitato l'host virtuale aggiuntivo. Vedi, dopo l'esecuzione a2ensiteper il secondo host virtuale, l'output di apache2ctl -Smostrerà che entrambi i siti sono disponibili (e uno di loro è il default), anche se non hai ricaricato apache.

Supponiamo che tu abbia due host virtuali: site1 e site2. Si esegue a2ensite site1e quindi si ricarica il servizio apache. Ora puoi accedere http://site1ed è l'impostazione predefinita. Ora corri a2ensite site2, ma dimentica di riavviare apache. L'output di apache2ctl -Ssarà:

VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server site1 (/etc/apache2/sites-enabled/site1:1)
         port 80 namevhost site1 (/etc/apache2/sites-enabled/site1:1)
         port 80 namevhost site2 (/etc/apache2/sites-enabled/site2:1)
Syntax OK

Ma quando si tenta di caricare http://site2, verrà effettivamente caricato il sito predefinito (site1), poiché la configurazione non è caricata.


Ottengo lo stesso output ma anche in questo caso non carica il secondo sito Web.
Arqam,

15

Ho avuto un problema simile in cui i miei vhosts aggiuntivi sulla porta 443 (SSL / HTTPS) venivano tutti indirizzati alla directory del primo vhost elencato. Apache essenzialmente ignorava la proprietà servername e corrispondeva solo sulla porta ip:.

Risulta che mi mancava il comando 'NameVirtualHost *: 443' per abilitare l'hosting virtuale con nome per la porta 443.

'NameVirtualHost *: 443' deve essere chiamato una sola volta e deve essere definito sopra i vhosts per la porta 443. Ho inserito la mia definizione nel file ports.config in modo che assomigli a:

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

Non dimenticare di riavviare apache dopo eventuali modifiche.


1
Per quello che vale ... in Apache 2.4.18, l'utilizzo NameVirtualHostproduce questo messaggio all'avvio:AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/ports.conf
Lambart

4

I miei 2 centesimi: poiché devo attenermi a un IP (non voglio che il sito venga servito su tutte le reti installate), è successo che dopo che l'IP privato locale del server è cambiato, ho dimenticato di cambiarlo qui:

NameVirtualHost 192.168.100.20:80 <VirtualHost 192.168.100.20:80>

Ovviamente non è un problema Apache per farti sapere che l'IP non esiste localmente.


2

Tom, per favore guarda qui http://httpd.apache.org/docs/2.0/en/mod/core.html#namevirtualhost

Nota

Nota, che il "server principale" e gli eventuali predefinite server saranno mai essere serviti per una richiesta a un indirizzo IP NameVirtualHost (a meno che per qualche motivo si specifica NameVirtualHost ma poi non definisce alcuna VirtualHosts per questo indirizzo).

Quindi dovrebbe andare bene se si modifica l' impostazione predefinita sull'indirizzo IP del proprio server.


Ci ho provato, ma non ha cambiato nulla. Vorrei anche evitare di legarmi a un determinato IP, quindi lo cambierò di nuovo. Inoltre, devo sottolineare che il vhost predefinito è quello che funziona.
Tom Wright,

1

Trovo la risposta da qui: http://alexking.org/blog/2007/11/01/apache-2-only-serves-first-virtual-host

Inserisci 2 servername nello stesso 1 tag VirtualHost come di seguito:

<VirtualHost *:80>
ServerName beta-site-1.com
DocumentRoot "/Library/WebServer/beta-site-1"

ServerName beta-site-2.com
DocumentRoot "/Library/WebServer/beta-site-2"
</VirtualHost>

Ho finito per avere problemi con il secondo sito perché avevo due blocchi di tag VirtualHost.


0

Ho avuto questo problema durante la migrazione dei siti su un nuovo server Ubuntu 16. Dopo un po 'di grattacapi, mi sono reso conto che il modulo SSL non era abilitato per impostazione predefinita, quindi qualsiasi cosa all'interno dei <IfModule mod_ssl.c>blocchi è ovviamente silenziosamente ignorata.

Anni fa ho racchiuso tutti i miei host SSL in questo condizionale, e questa volta avevo appena copiato i file di configurazione sul nuovo server.

L'ho risolto abilitando il modulo:

sudo a2enmod ssl

0

Ho scoperto che la fonte di questo problema era una voce / etc / hosts sul mio server con l'URL che puntava all'IP esterno del server.

Ad un certo punto devo averlo impostato prima che il DNS fosse pronto, quindi ho inserito una voce / etc / hosts sul mio server che punta al proprio IP esterno:

1.2.3.4 vhost.example.com

Quindi ho impostato un ServerAlias ​​su un sito esistente per "vhost.example.com"

Ma nulla che potrei fare impedirebbe ad Apache di pubblicare il sito default-ssl.conf per le richieste SSL a vhost.example.com. HTTP della porta 80 ha funzionato correttamente, ma SSL ha sempre mostrato invece il sito predefinito. Alla fine questo thread SO mi ha portato a provare "apachectl -S" che mostra i siti e finalmente sono riuscito a capirlo.

Quindi, se stai ottenendo il sito SSL predefinito invece del sito che ti aspetti, assicurati di non aver aggiunto l'indirizzo IP esterno del tuo server in una voce / etc / hosts! Una cosa abbastanza strana da fare col senno di poi, ma spero che questo aiuti qualcun altro!

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.