web-dev-qa-db-fra.com

Quel est le problème avec ce fichier Apache httpd.conf pour vhosts?

Qu'est-ce qui ne va pas ici?

_NameVirtualHost *:80

<VirtualHost *:80>
ServerName www.apples.co.uk
DocumentRoot /var/www/apples.co.uk
RewriteEngine On
RewriteCond %{HTTP_Host} !^www\.apples\.co\.uk$ [NC]
RewriteRule ^(.*)$ http://www.apples.co.uk/$1 [L,R=301]
</VirtualHost>

<VirtualHost *:80>
ServerName www.bananas.co.uk
DocumentRoot /var/www/bananas.co.uk
RewriteEngine On
RewriteCond %{HTTP_Host} !^www\.bananas\.co\.uk$ [NC]
RewriteRule ^(.*)$ http://www.bananas.co.uk/$1 [L,R=301]
</VirtualHost>
_

Problèmes:

  • _apples.co.uk_ redirige correctement vers _www.apples.co.uk_, mais _bananas.co.uk_ redirige vers _www.apples.co.uk_.

  • Lorsque _apples.co.uk_ ou _bananas.co.uk_ est redirigé, la barre d'adresse résulte de _http://www.apples.co.uk//_. Quelle est la cause de cette barre oblique supplémentaire à la fin?

Voici la sortie de _apachectl -S_:

_[Sun Jul 31 08:41:52 2011] [warn] NameVirtualHost *:80 has no VirtualHosts
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server www.apples.co.uk (/etc/Apache2/httpd.conf:3)
         port 80 namevhost www.apples.co.uk (/etc/Apache2/httpd.conf:3)
         port 80 namevhost www.bananas.co.uk (/etc/Apache2/httpd.conf:11)
         port 80 namevhost servername.apples.co.uk (/etc/Apache2/sites-enabled/000-default:1)
Syntax OK
_

Je suppose que le premier problème est causé par le paramètre _default server_. Comment puis-je enlever ça? Faut-il un défaut?

Je sais que j'ai également besoin d'ajouter _sites-enabled_ pour supprimer l'avertissement, mais je vais laisser cela pour une autre question.

2
paradroid

FIRST:

  1. VirtualHost défini en premier sera utilisé pour tout attraper pour des noms de domaine inconnus.

  2. Apache ne connaît pas apples.co.uk, il ne connaît que www.apples.co.uk. Il utilise donc le premier hôte virtuel pour servir apples.co.uk. La redirection fonctionnera bien ici.

  3. Apache ne connaît pas bananas.co.uk, il ne connaît que www.bananas.co.uk. Il utilise donc le premier hôte virtuel pour servir bananas.co.uk .. qui est www.apples.co.uk. Par conséquent, il sera redirigé vers www.apples.co.uk.

Pour résoudre le problème ci-dessus: Ajoutez ServerAlias apples.co.uk ligne à l'intérieur du premier hôte virtuel et ServerAlias bananas.co.uk au deuxième. Si vous souhaitez également capturer TOUT sous-domaine, ajoutez également cette ligne: ServerAlias *.apples.co.uk (idem pour bananas.co.uk).


SECONDE

L'URL RewriteRule inclura une barre oblique si elle est déclarée dans le contexte serveur config/virtual host. Si cette règle de réécriture était déclarée dans .htaccess, cela fonctionnerait correctement, mais ici (dans la déclaration de VirtualHost), vous devez supprimer la barre oblique après le nom de domaine dans RewriteRule target. C'est pourquoi vous rencontrez une double barre oblique après le nom de domaine lors de la redirection.

Vous pouvez également accélérer un peu la correspondance d'hôte en remplaçant une expression rationnelle relativement coûteuse par une simple comparaison de chaînes: !^www\.bananas\.co\.uk$ => !=www.bananas.co.uk.


NameVirtualHost *:80

<VirtualHost *:80>
   ServerName www.apples.co.uk
   ServerAlias apples.co.uk
   DocumentRoot /var/www/apples.co.uk
   RewriteEngine On
   RewriteCond %{HTTP_Host} !=www.apples.co.uk [NC]
   RewriteRule ^(.*)$ http://www.apples.co.uk$1 [L,R=301]
</VirtualHost>

<VirtualHost *:80>
   ServerName www.bananas.co.uk
   ServerAlias bananas.co.uk
   ServerAlias *.bananas.co.uk
   DocumentRoot /var/www/bananas.co.uk
   RewriteEngine On
   RewriteCond %{HTTP_Host} !=www.bananas.co.uk [NC]
   RewriteRule ^(.*)$ http://www.bananas.co.uk$1 [L,R=301]
</VirtualHost>

Je suppose que le premier problème est causé par le paramètre du serveur par défaut. Comment puis-je enlever ça? Faut-il un défaut?

Créez VirtualHost pour un faux nom de domaine .. et placez-le en premier (avant toute autre déclaration <VirtualHost> _) - vous verrez alors la page d'erreur d'Apache lorsqu'un tel nom de domaine inconnu sera demandé.

6
LazyOne