web-dev-qa-db-ja.com

Apacheが、リクエストされたURLと一致するServerNameを持つ仮想ホストを無視するのはなぜですか?

2つ目の仮想ホストをApache構成に追加しようとしていますが、新しい仮想ホストを使用できないようです。

私のhttpd.confには、次の行が含まれています。

ServerName radiofreebrighton.org.uk

ports.confファイルもあり、次の内容が含まれています。

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    Listen 443
</IfModule>

sites-availableには、sites-enabledによってa2ensiteにシンボリックリンクされた2つのファイルがあります。

  • radiofreebrighton.org.uk
  • trafalgararches.co.uk

最初の内容は次のとおりです。

<VirtualHost _default_:80>
    DocumentRoot /home/tom/www

    ServerAdmin [email protected]
    ServerName radiofreebrighton.org.uk
    ServerAlias www.radiofreebrighton.org.uk

    <Directory /home/tom/www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    ErrorLog /var/log/Apache2/error.log
    LogLevel error
    CustomLog /var/log/Apache2/access.log combined

    Alias /wiki /home/tom/www/mediawiki/index.php
</VirtualHost>

後者の内容は次のとおりです。

<VirtualHost *:80>
    DocumentRoot /home/tom/tata-www

    ServerAdmin [email protected]
    ServerName trafalgararches.co.uk
    ServerAlias www.trafalgararches.co.uk

    <Directory /home/tom/tata-www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    logLevel error
    ErrorLog /var/log/Apache2/error.log
</VirtualHost>

しかし、trafalgararches.co.ukにページをリクエストするたびに、radiofreebrighton.org.ukからページが提供されます。なぜこれが起こっているのでしょうか?どうすれば修正できますか?


編集:

Apacheが理解する仮想ホスト構成:

tom@rfb:/usr/local$ Apache2ctl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server radiofreebrighton.org.uk (/etc/Apache2/sites-enabled/radiofreebrighton.org.uk:1)
         port 80 namevhost radiofreebrighton.org.uk (/etc/Apache2/sites-enabled/radiofreebrighton.org.uk:1)
         port 80 namevhost trafalgararches.co.uk (/etc/Apache2/sites-enabled/trafalgararches.co.uk:1)
Syntax OK

Apache2ctl -Sまたはhttpd -Sによって収集されます。)

27
Tom Wright

これは明白かもしれませんが、追加の仮想ホストを有効にした後Apacheサービスを再起動することを忘れないでください

2番目の仮想ホストに対してa2ensiteを実行した後、Apache2ctl -Sの出力は両方のサイトが構成されていることを反映します(そのうちの1つがデフォルトです)が、Apacheをリロードするまでライブにはなりません。


たとえば、site1とsite2という2つの仮想ホストがあるとします。 a2ensite site1を実行してから、Apacheサービスをリロードします。これでhttp://site1にアクセスでき、これがデフォルトです。ここでa2ensite site2を実行しますが、Apacheの再起動を忘れています。 Apache2ctl -Sの出力は次のようになります。

VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server site1 (/etc/Apache2/sites-enabled/site1:1)
         port 80 namevhost site1 (/etc/Apache2/sites-enabled/site1:1)
         port 80 namevhost site2 (/etc/Apache2/sites-enabled/site2:1)
Syntax OK

ただし、http://site2を読み込もうとすると、構成が読み込まれていないため、実際にはデフォルトのサイト(site1)が読み込まれます。

16
prngleo

ポート443(SSL/HTTPS)上の追加の仮想ホストがすべて、リストされている最初の仮想ホストのディレクトリに送られるという同様の問題がありました。 Apacheは本質的にservernameプロパティを無視し、ip:portのみを照合していました。

ポート443の名前付き仮想ホスティングを有効にするコマンド「NameVirtualHost *:443」が欠落していることがわかりました。

'NameVirtualHost *:443'は一度だけ呼び出す必要があり、ポート443のvhostsの上に定義する必要があります。私の定義をports.configファイルに追加すると、次のようになります。

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

変更後は必ずApacheを再起動してください。

15
Lucas

私の2セント:IPに固執する必要があるため(インストールされているすべてのネットワークでサイトを提供したくない)、サーバーのローカルプライベートIPを変更した後、ここで変更するのを忘れていました。

NameVirtualHost 192.168.100.20:80 <VirtualHost 192.168.100.20:80>

もちろん、IPがローカルに存在しないことを知らせるのはApacheの問題ではありません。

4
maraboshi

トム、ここを見てください http://httpd.Apache.org/docs/2.0/en/mod/core.html#namevirtualhost

注意

「メインサーバー」と任意のdefaultサーバーがneverNameVirtualHost IPアドレスへのリクエストに対してserved(何らかの理由でNameVirtualHostを指定しない限り、そのアドレスにはVirtualHostsを定義しないでください)。

したがって、defaultをサーバーのIPアドレスに変更しても問題ありません。

2

私はここから答えを見つけます: http://alexking.org/blog/2007/11/01/Apache-2-only-serves-first-virtual-Host

以下のように、同じ1つのVirtualHostタグに2つのサーバー名を配置します。

<VirtualHost *:80>
ServerName beta-site-1.com
DocumentRoot "/Library/WebServer/beta-site-1"

ServerName beta-site-2.com
DocumentRoot "/Library/WebServer/beta-site-2"
</VirtualHost>

2つのVirtualHostタグブロックがあったため、2番目のサイトで問題が発生しました。

1
Tu Uyen

この問題の原因は、サーバーの/ etc/hostsエントリで、サーバーの外部IPを指すURLが含まれていることを発見しました。

ある時点で、DNSの準備が整う前に設定していたはずなので、サーバーに/ etc/hostsエントリを入力して、独自の外部IPをポイントしました。

 1.2.3.4 vhost.example.com 

次に、「vhost.example.com」の既存のサイトにServerAliasを設定します

しかし、vhost.example.comへのSSLリクエストに対して、Apacheがdefault-ssl.confサイトにサービスを提供するのを止めることはできませんでした。ポート80 HTTPは問題なく動作しましたが、SSLは常にデフォルトサイトを常に示していました。最後に、このSO=スレッドにより、サイトを表示する "apachectl -S"を試すようになり、最後にそれを理解することができました。

したがって、期待したサイトではなくデフォルトのSSLサイトを取得している場合は、サーバーの外部IPアドレスを/ etc/hostsエントリに追加していないことを確認してください。後からやってみるとかなり奇妙なことですが、うまくいけば、これは他の人の役に立つでしょう!

1

サイトを新しいUbuntu 16サーバーに移行するときにこの問題が発生しました。少し頭を悩ませた後、SSLモジュールがデフォルトで有効になっていなかったので、<IfModule mod_ssl.c>ブロックはもちろん黙って無視されます。

数年前、すべてのSSL仮想ホストをこの条件付きでラップしましたが、今回は、構成ファイルを新しいサーバーにコピーしたところです。

モジュールを有効にして修正しました:

Sudo a2enmod ssl
0
scipilot