web-dev-qa-db-ja.com

仮想ホストのルートディレクトリにリダイレクトされるサブドメイン

VPSに3つの異なるドメインとサブドメインを配置しようとしています。

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

それらを設定しましたが、何らかの理由で各サブドメインがexample.comのルートディレクトリにある同じindex.htmlにリダイレクトされています

intranet.example.comのスクリーンショット:

intranet.example.com

example.comのスクリーンショット:

example.com

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>

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>

仮想ホストを正しく構成しましたか?

Example.comの443仮想ホストは次のとおりです。

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

これは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

コメントで述べたように、私はあなたが報告しているように見える偽のリダイレクトを見ることはなく、2つのURLは異なるコンテンツを返すように見えます(ただし、それらは「似ている」ように見えます)。それで、これは異なるindex.htmlドキュメントを表示するように見えますが、同じではありませんか?

現在の問題の原因ではありませんが、<VirtualHost *:80>コンテナでのリダイレクトは不必要に複雑であり、.htaccessでのwwwからwwwへのリダイレクトは正しくありません(URLパスを削除しています)。

例えば:

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

このSERVER_NAMEコンテナー内の<VirtualHost>を確認する必要はありません。 SERVER_NAMEは、チェックする2つの値のいずれかである必要があります。そうでない場合、そもそもコードのこの時点では決してありません。

また、 HSTS を実装する計画がない限り、二重リダイレクトを回避するために、標準のwwwサブドメイン(後で.htaccessで行う)にリダイレクトすることもできます。

したがって、これは単一のmod_aliasリダイレクトに単純化できます。

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

サブドメインについても繰り返します。

Aside:理想的には、各ドメインの非標準の非wwwバージョンに個別の<VirtualHost *:443>があり、標準への単純なリダイレクトを発行しますwwwバージョン。これには明らかにコードが含まれますが、別の方法として、既存の<VirtualHost *:443>コンテナーでmod_rewriteリダイレクトを使用することもできます。これは、.htaccessで行っていることに似ています。)

.htaccess

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

これはremovesリクエストからURLパスを削除し、常にドキュメントルートにリダイレクトしますが、これは意図していないと確信しています。 (SEOにとっては悪いことです。また、なぜRewriteRulepatternでURLパスをキャプチャし、それで何もしません。 ?)

RewriteRulesubstitution$1後方参照を含める必要があります。次に例を示します。

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

ブラウザのキャッシュをクリアしたことを確認する必要があります。

2
MrWhite