web-dev-qa-db-fra.com

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 car j'utilise SSL. Chaque fois que je mets à jour mes règles mod_rewrite, je dois me souvenir de le faire aux deux endroits, sinon je casse mon application ... cette duplication pose des problèmes. Existe-t-il un moyen de les combiner ou de les alias - la seule différence entre les deux est que la version du port 443 contient le SSLEngine, SSLCertificateFile et similaires.

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

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

58
scotts

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

article

par exemple.:

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

Vous pouvez utiliser n'importe quel nombre 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>
34
Sampath Perera

Désolé de remonter un vieux post comme celui-ci, mais afin d'aider d'autres Googleurs là-bas, je voulais partager comment je l'ai traité:

J'ai quelques vhosts sur mon hôte local, dites: localhost, foo.com, bar.com

Ceci étant un site localhost sur mon ordinateur portable (macosx), je pourrais m'en tirer avec des certificats auto-signés et donc la partie ssl est la même pour tous les vhosts ...

Voici ce que j'ai fait:

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

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

UNE /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>
8
RemyNL

Une autre option au lieu d'utiliser Include utilise Macro (vous pouvez donc tout garder dans un seul fichier).

Activez d'abord le module macro:

a2enmod macro

Ensuite, mettez vos trucs partagés dans une macro et use à partir de vos hôtes virtuels:

<Macro SharedStuff>
   ServerName example.com
   ServerAdmin [email protected]
   <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; afin que vous puissiez les utiliser un peu comme les fonctions et économiser beaucoup de duplication dans vos fichiers de configuration Apache.

Voir ici pour plus de détails:

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

3
Seb

Vous pouvez 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>
2
sme

Vous pouvez également spécifier les directives communes dans un conteneur plutôt que dans le conteneur lui-même. C'est ce que je fais, principalement parce que je préfère les règles mod_rewrite au niveau du répertoire plutôt qu'au niveau du serveur, mais cela devrait aussi bien fonctionner pour vous.

0
Matt Jacob