web-dev-qa-db-ja.com

000-default.confを有効にすると、名前ベースの仮想ホストが壊れます

サーバーにdev.somedomain.comとsomedomain.comの2つのサイトがあります。後者のServerAliasは* .somedomain.comです。すべてのドメインはSSL対応であり、ポート80へのすべてのリクエストはhttpsにリダイレクトされます。 somedomain.comサイトは、廃止予定の別のサーバーにある古いサイトのプロキシです。

dev.somedomain.comは魅力のように機能します

http://somedomain.comは何らかの理由で000-default.conf構成に「キャッチ」されますが(httpsはそうではありません)、http://www.somedomain.com(serveralias * .somedomain.com)は000-defaultに「キャッチ」されません。 .conf、および期待どおりに動作しています。

000-default.confを無効にすると、 https://dev.somedomain.com/phpmyadmin (000-defaultが有効になっている場合に機能します-理由を理解していると思いますが、 )

私は高低を検索しましたが、これを理解することができませんでした。

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>

そして、000-default.confは、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:(これには問題はないようですが、確認のためにここに含まれています)

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

長い質問の短い:http://somedomain.comがapachesのデフォルトページを表示するのに対し、http://www.somedomain.comは-予想どおり-https://somedomain.comにリダイレクトされますか?

答えは明白で、私はただ盲目だと思いますが、何が起こっているのか本当に分かりません。

ありがとうございました

編集

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

まず、コマンドapachectl -Sの出力から始めます。すべての仮想ホストとそれらが由来するファイルを表示します。

出力で最初にリストされている仮想ホストは、「デフォルトの仮想ホスト」です。これは000-default.confにあると思います。その場合、その仮想ホストにはServerNameがないため、グローバル(サーバー)コンテキストまたはマシンのホスト名から仮想ホストを取得します。これが「somedomain.com」の場合、このドメインへのリクエストはこの仮想ホストに到達します。がそうでない場合は、トラブルシューティングに役立つapachectl -Sの出力を表示してください。

説明:これは仮想ホストの動作方法です。 ApachaeはServerNameまたはServerAliasに対して使用されるホスト名(実際には 'Host' HTTPヘッダーの内容)を一致させようとし、一致する仮想ホストがリクエストを受信すると、それを見つけます。一致するものが見つからない場合、リストされている最初の仮想ホストが使用されます。したがって、同じServerNameを持つ2つの仮想ホストがある場合、最初のホストのみがその名前を使用してアクセスできます。

ベストプラクティス:すべての仮想ホストにServerNameを与えて、どのリクエストがそれぞれに届くかを明確に確認し、設定変更を行うたびにapachectl -Sを実行します

2
Unbeliever