web-dev-qa-db-fra.com

L'activation de 000-default.conf interrompt vhost basé sur le nom

J'ai deux sites sur un serveur: dev.somedomain.com et somedomain.com - ce dernier a un ServerAlias ​​de * .somedomain.com. Tous les domaines sont compatibles SSL, et toutes les demandes adressées au port 80 sont redirigées vers https. Le site somedomain.com est un proxy d'un ancien site, sur un serveur différent, sur le point d'être déconnecté.

dev.somedomain.com fonctionne à merveille

http://somedomain.com est pour une raison quelconque "pris" par la configuration 000-default.conf (https n'est pas), mais http://www.somedomain.com (le serveralias * .somedomain.com) n'est pas "pris" par 000-default .conf, et fonctionne comme prévu.

Si je désactive le fichier 000-default.conf, tout semble fonctionner, à l'exception de https://dev.somedomain.com/phpmyadmin (qui fonctionne avec 000-default activé - Je pense comprendre pourquoi )

J'ai cherché haut et bas, mais j'ai été incapable de comprendre cela.

somedomain.conf:

<VirtualHost *:80>
    ServerName dev.somedomain.com

    Redirect 301 / https://dev.somedomain.com
</VirtualHost>

<VirtualHost *:80>
    ServerName somedomain.com
    ServerAlias *.somedomain.com

    Redirect 302 / https://somedomain.com/
</VirtualHost>

Et le 000-default.conf, qui semble casser somedomain.conf:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${Apache_LOG_DIR}/error.log
    CustomLog ${Apache_LOG_DIR}/access.log combined
</VirtualHost>

somedomain-ssl.conf: (celui-ci ne semble pas avoir de problèmes, mais inclus ici pour en être sûr)

<IfModule mod_ssl.c>
    <VirtualHost *:443>
        ServerName dev.somedomain.com

        DocumentRoot "/var/www/somedomain/wwwroot"
        Alias /phpmyadmin /usr/share/phpmyadmin
        Alias /index.php /var/www/somedomain/index.php
        Alias /import-data.php /var/www/somedomain/import.php
        <Directory /var/www/somedomain/wwwroot>
            Options FollowSymLinks
            AllowOverride None

            Require all granted

            RewriteEngine On
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^(.*)$ index.php?url=$1 [QSA]
        </Directory>

        ErrorLog /var/www/somedomain/logs/error.log
        CustomLog /var/www/somedomain/logs/access.log combined

        ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.0-fpm.sock|fcgi://localhost/var/www/somedomain/

        SSLCertificateFile /etc/letsencrypt/live/dev.somedomain.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/dev.somedomain.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-Apache.conf
    </VirtualHost>

    <VirtualHost *:443>
        ServerName somedomain.com

        <Location "/">
        ProxyPreserveHost On

        #anonymised IP to protect the guilty:
        ProxyPass http://172.0.0.10/
        ProxyPassReverse http://somedomain.com/

        AddOutputFilterByType INFLATE;SUBSTITUTE;DEFLATE text/html
        Substitute "s|http://somedomain.com/|/|iq"
        SetOutputFilter DEFLATE
        </Location>

        SSLCertificateFile /etc/letsencrypt/live/dev.somedomain.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/dev.somedomain.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-Apache.conf
    </VirtualHost>
</IfModule>

Longue question: pourquoi http://somedomain.com affiche-t-il la page par défaut d'Apaches, alors que http://www.somedomain.com est - comme prévu - redirigé vers https://somedomain.com?

Je suppose que la réponse est évidente et que je suis aveugle, mais je ne sais vraiment pas ce qui se passe.

Je vous remercie

EDIT

VirtualHost configuration:
*:443                  is a NameVirtualHost
         default server dev.somedomain.com (/etc/Apache2/sites-enabled/somedomain-ssl.conf:2)
         port 443 namevhost dev.somedomain.com (/etc/Apache2/sites-enabled/somedomain-ssl.conf:2)
         port 443 namevhost somedomain.com (/etc/Apache2/sites-enabled/somedomain-ssl.conf:35)
*:80                   is a NameVirtualHost
         default server somedomain.com (/etc/Apache2/sites-enabled/000-default.conf:1)
         port 80 namevhost somedomain.com (/etc/Apache2/sites-enabled/000-default.conf:1)
         port 80 namevhost dev.somedomain.com (/etc/Apache2/sites-enabled/somedomain.conf:1)
         port 80 namevhost somedomain.com (/etc/Apache2/sites-enabled/somedomain.conf:7)
                 wild alias *.somedomain.com
2
Vonsild

Commencez d'abord par le résultat de la commande apachectl -S. Il vous montre tous vos hôtes virtuels et les fichiers dont ils proviennent.

Le premier hôte virtuel répertorié dans la sortie est l'hôte virtuel par défaut. Je suppose que c'est celui de 000-default.conf. Si tel est le cas, cet hôte virtuel n'a pas de ServerName et prendra donc celui du contexte global (serveur) ou du nom d'hôte de la machine. S'il s'agit de "somedomain.com", cela signifie que les demandes de ce domaine vont atterrir sur cet hôte virtuel. Si n'est pas le nous montrer la sortie de apachectl -S pour aider à dépanner.

Explication: C'est simplement ainsi que fonctionnent les hôtes virtuels. Apachae essaie de faire correspondre le nom d'hôte utilisé (en réalité le contenu de l'en-tête HTTP 'Host') à n'importe quel ServerName ou ServerAlias et dès qu'il trouve une correspondance, l'hôte virtuel reçoit la demande. Si aucune correspondance n'est trouvée, le premier hôte virtuel répertorié est utilisé. Donc, si vous avez deux hôtes virtuels avec le même ServerName, seul le premier test sera accessible avec ce nom.

Meilleure pratique: Donnez à chaque hôte virtuel un ServerName pour vous assurer de savoir explicitement quelles requêtes vont atterrir sur chacune d'entre elles, et chaque fois que vous apportez une modification de configuration, exécutez apachectl -S

2
Unbeliever