web-dev-qa-db-fra.com

Les sous-domaines sont redirigés vers le répertoire racine de virtualhost

J'essaie d'avoir 3 domaines et sous-domaines différents sur mon VPS:

  • pd.example.com
  • intranet.exemple.com
  • exemple.com

Je les ai configurés, mais pour une raison quelconque, chaque sous-domaine est redirigé vers le même index.html qui se trouve dans le répertoire racine de example.com

La capture d'écran de intranet.example.com:

intranet.example.com

La capture d'écran de example.com:

example.com

Voici l'hôte virtuel pour intranet.example.com:

<VirtualHost *:80>

    ServerAdmin [email protected]
    ServerName intranet.example.com
    ServerAlias www.intranet.example.com
    DocumentRoot "/var/www/intranet/"

    <Directory "/var/www/intranet/">

            Options Indexes FollowSymLinks
            AllowOverride all
            Require all granted

    </Directory>

    ErrorLog ${Apache_LOG_DIR}/error.log
    CustomLog ${Apache_LOG_DIR}/access.log combined

    RewriteEngine on
    RewriteCond %{SERVER_NAME} =www.intranet.example.com [OR]
    RewriteCond %{SERVER_NAME} =intranet.example.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Voici l'hôte virtuel pour example.com:

<VirtualHost *:80>

    ServerAdmin [email protected]
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example

    <Directory /var/www/example>

            Options Indexes FollowSymLinks
            AllowOverride all
            Require all granted

    </Directory>

    ErrorLog ${Apache_LOG_DIR}/error.log
    CustomLog ${Apache_LOG_DIR}/access.log combined

    RewriteEngine on
    RewriteCond %{SERVER_NAME} =www.example.com [OR]
    RewriteCond %{SERVER_NAME} =example.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Ai-je correctement configuré mes hôtes virtuels?

Voici les hôtes virtuels 443 pour example.com:

    <IfModule mod_ssl.c>
    <VirtualHost *:443>

    ServerAdmin [email protected]
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example

    <Directory /var/www/example>

            Options Indexes FollowSymLinks
            AllowOverride all
            Require all granted

    </Directory>

    ErrorLog ${Apache_LOG_DIR}/error.log
    CustomLog ${Apache_LOG_DIR}/access.log combined

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

Ceci est pour intranet.example.com:

    <IfModule mod_ssl.c>
    <VirtualHost *:443>

    ServerAdmin [email protected]
    ServerName intranet.example.com
    ServerAlias www.intranet.example.com
    DocumentRoot "/var/www/intranet/"

    <Directory "/var/www/intranet/">

            Options Indexes FollowSymLinks
            AllowOverride all
            Require all granted

    </Directory>

    ErrorLog ${Apache_LOG_DIR}/error.log
    CustomLog ${Apache_LOG_DIR}/access.log combined

    Include /etc/letsencrypt/options-ssl-Apache.conf
    SSLCertificateFile /etc/letsencrypt/live/www.intranet.example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/www.intranet.lsgob.us/privkey.pem
    </VirtualHost>
    </IfModule>

.htaccess

    RewriteEngine On
    RewriteCond %{HTTP_Host} !^www\.
    RewriteRule ^(.*)$ https://www.%{HTTP_Host} [R=301,L]
1
Alex Block

Comme mentionné dans les commentaires, je ne vois aucune redirection parasite que vous semblez signaler et les deux URL semblent renvoyer un contenu différent (bien qu'elles "se ressemblent"). Donc, cela semble montrer différents index.html documents, pas les mêmes?

Ce n'est pas la cause du problème actuel, mais votre redirection dans vos conteneurs <VirtualHost *:80> est inutilement complexe et la redirection non www vers www dans .htaccess est incorrecte (vous supprimez le chemin URL).

Par exemple:

RewriteEngine on
RewriteCond %{SERVER_NAME} =www.example.com [OR]
RewriteCond %{SERVER_NAME} =example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

Il n'est pas nécessaire de vérifier le SERVER_NAME dans ce conteneur <VirtualHost>. Le SERVER_NAME doit déjà être l'une des deux valeurs que vous recherchez, sinon il ne se trouverait jamais à ce stade du code.

Et, sauf si vous avez l'intention d'implémenter HSTS , vous pouvez également rediriger vers le sous-domaine canonique www (que vous ferez plus tard dans .htaccess) afin d'éviter une double redirection .

Donc, cela pourrait être simplifié à une seule redirection mod_alias:

Redirect 301 / https://www.example.com/

Répétez l'opération pour vos sous-domaines.

( De plus: Idéalement, vous devriez également avoir un <VirtualHost *:443> séparé pour la version non canonique non www de chaque domaine qui émet une simple redirection vers la version canonique www. Bien que cela implique certes plus de code, vous pouvez également utiliser une redirection mod_rewrite dans vos conteneurs <VirtualHost *:443> existants, similaire à ce que vous faites dans .htaccess.)

.htaccess

RewriteEngine On
RewriteCond %{HTTP_Host} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_Host} [R=301,L]

Ceci supprime le chemin de l'URL de la demande et redirige toujours vers la racine du document, ce qui, j'en suis sûr, n'est pas l'intention. (Ce serait mauvais pour le référencement et pourquoi capturer le chemin de l'URL dans le motif RewriteRule et ne rien faire avec ?)

Vous devez inclure le backreference $1 dans la substitution RewriteRule, par exemple:

RewriteRule (.*) https://www.%{HTTP_Host}/$1 [R=301,L]

Vous devrez vous assurer que vous avez effacé le cache de votre navigateur.

2
MrWhite