62 votes

Dois-je dupliquer les directives Virtualhost pour les ports 80 et 443 ?

J'ai une liste longue et complexe de directives <VirtualHost>, et je dois les dupliquer dans des groupes <VirtualHost> séparés pour les ports 80 et 443 parce que j'utilise SSL. Chaque fois que je mets à jour mes règles mod_rewrite, je dois me rappeler de le faire aux deux endroits, sinon je casse mon application... cette duplication est une source de problèmes. Existe-t-il un moyen de les combiner ou de les aliaser ? La seule différence entre les deux est que la version du port 443 contient le SSLEngine, le SSLCertificateFile et autres.

Mon <Virtualhost> contient de nombreuses règles mod_rewrite, règles LocationMatch, directives CGI, etc.

De plus, je ne peux pas utiliser les fichiers .htaccess.

1 votes

52voto

sfossen Points 3671

Ne pouvez-vous pas utiliser une directive include pour inclure les règles communes. aquí

article

eg. :

<VirtualHost _default_:80>
    ...
    include conf/common_rule.conf
</VirtualHost>

<VirtualHost _default_:*>
    ...
    include conf/common_rule.conf
</VirtualHost> 

<VirtualHost _default_:443>
    ... #SSL rules
    include conf/common_rule.conf
</VirtualHost>

0 votes

Merci pour cela, voici une version mise à jour de l'apache include qui est la première ressource liée à votre réponse.

0 votes

Une solution plus simple pour moi a été de renommer *:80 en *:443, puis de configurer un tout petit hôte virtuel *:80 qui redirige. Je réalise que cela ne répond pas directement à la question initiale, mais si cela vous intéresse, je serai heureux de partager ma configuration.

36voto

Sampath Perera Points 109

Vous pouvez utiliser un nombre quelconque d'hôtes et de ports dans une seule directive Virtualhost.

<VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost> 

Dans mon cas, j'ai utilisé.

<VirtualHost *:80 *:443>
  ServerName loop.lk

 ....
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/local.crt

</VirtualHost>

9 votes

SSLEngine on semble être appliqué même lorsque le site est accessible via http, ce qui entraîne une page d'erreur.

2 votes

Si vous avez un <VirtualHost *:80 *:443> je suppose que vous pouvez alors avoir un bloc séparé pour <VirtualHost *:443> qui ne comprend que le SSL. Est-ce que c'est correct ?

3 votes

@iconoclast Non, vous ne pouvez pas avoir une autre directive <VirtualHost>. Vous pouvez utiliser <If "%{SERVER_PROTOCOL} != 'HTTPS'"> .... </If> OU <If "%{SERVER_PORT} != '443'"> ... </If>

9voto

RemyNL Points 456

Désolé de ressortir un vieux message comme celui-ci, mais pour aider d'autres Googlers, je voulais partager la façon dont j'ai géré ce problème :

J'ai plusieurs serveurs virtuels sur mon serveur local, par exemple : localhost , foo.com , bar.com

Comme il s'agit d'un site local sur mon ordinateur portable (macosx), j'ai pu m'en sortir avec des certificats auto-signés et la partie ssl est donc la même pour tous les vhosts...

Ce que j'ai fait, c'est ça :

J'ai créé le répertoire /etc/apache2/extra/vhosts/ .

J'ai créé un /etc/apache2/extra/vhosts/localhost.conf :

ServerName localhost
DocumentRoot "/www/localhost"
<Directory /www/localhost>
  Require all granted
</Directory>
ErrorLog "/var/log/apache2/localhost.error_log"
CustomLog "/var/log/apache2/localhost.access_log" common

A /etc/apache2/extra/vhosts/foo.conf :

ServerName foo.com
DocumentRoot "/www/foo.com"
<Directory /www/foo.com>
  Require all granted
</Directory>
ErrorLog "/var/log/apache2/foo.com.error_log"
CustomLog "/var/log/apache2/foo.com.access_log" common

A /etc/apache2/extra/vhosts/bar.conf :

ServerName bar.com
DocumentRoot "/www/bar.com"
<Directory /www/bar.com>
  Require all granted
</Directory>
ErrorLog "/var/log/apache2/bar.com.error_log"
CustomLog "/var/log/apache2/bar.com.access_log" common

Et enfin un /etc/apache2/extra/vhosts/ssl.conf :

SSLEngine on
SSLCertificateFile "/etc/apache2/ssl/server.crt"
SSLCertificateKeyFile "/etc/apache2/ssl/server.key"

Et dans mon /etc/apache2/extra/httpd-vhosts.conf :

<VirtualHost *:80>
  Include /etc/apache2/extra/vhosts/localhost.conf
</VirtualHost>
<VirtualHost *:443>
  Include /etc/apache2/extra/vhosts/localhost.conf
  Include /etc/apache2/extra/vhosts/ssl.conf
</VirtualHost>

<VirtualHost *:80>
  Include /etc/apache2/extra/vhosts/foo.conf
</VirtualHost>
<VirtualHost *:443>
  Include /etc/apache2/extra/vhosts/foo.conf
  Include /etc/apache2/extra/vhosts/ssl.conf
</VirtualHost>

<VirtualHost *:80>
  Include /etc/apache2/extra/vhosts/bar.conf
</VirtualHost>
<VirtualHost *:443>
  Include /etc/apache2/extra/vhosts/bar.conf
  Include /etc/apache2/extra/vhosts/ssl.conf
</VirtualHost>

7voto

Seb Points 1364

Une autre option au lieu d'utiliser Include utilise Macro (pour que vous puissiez tout conserver dans un seul fichier).

Activez d'abord le module macro :

a2enmod macro

Ensuite, mettez vos affaires partagées dans une macro et use à partir de vos virtualhosts :

<Macro SharedStuff>
   ServerName example.com
   ServerAdmin example@example.com
   <DocumentRoot /var/www/example>
      ...
   </DocumentRoot>
</Macro>

<VirtualHost *:80>
  Use SharedStuff
</VirtualHost>

<VirtualHost *:443>
  Use SharedStuff

  SSLEngine On
  SSLProtocol All -SSLv2 -SSLv3
  ...
</VirtualHost>

Les macros peuvent également prendre des paramètres, et être définies dans d'autres fichiers inclus ; vous pouvez donc les utiliser un peu comme des fonctions, et économiser beaucoup de duplications dans vos fichiers de configuration Apache.

Voir ici pour plus de détails :

https://httpd.apache.org/docs/2.4/mod/mod_macro.html

2voto

sme Points 1992

Vous pourriez mettre la configuration commune dans un fichier séparé et l'inclure dans les deux segments VirtualHost. Par exemple :

<VirtualHost 192.168.1.2:80>
  Include conf/common.conf
</VirtualHost>

<VirtualHost 192.168.1.2:443>
  Include conf/common.conf
  (put your ssl specific cofiguration stuff here ...)
</VirtualHost>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X