web-dev-qa-db-ja.com

Apacheデフォルト/キャッチオール仮想ホスト?

Domain1.com、domain2.com、domain3.comの3つのドメインがある場合、リストにないドメインにデフォルトの仮想ホストを設定することはできますか?たとえば、次のような場合:

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain1
ServerName domain1
ServerAlias Host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain2
ServerName domain2
ServerAlias Host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/everythingelse
ServerName *
ServerAlias Host
</VirtualHost>

ドメインを登録して私のサーバーをポイントすると、デフォルトでeverythingelseがdomain3と同じように表示されます。それは可能ですか?

68
SJaguar13

はい。ServerAliasが "*"であり、ServerNameが実際のホスト名に設定されていることを除いて、これは機能するはずです。 VirtualHostが最後にロードされることを確認する必要があるかもしれません...

45
freiheit

名前ベースの仮想ホストを使用する場合、最初にロードされる仮想ホスト構成がデフォルトになります(ソース: Apache Wiki )。たとえば、以下の設定では、一致しないドメインはdomain-one.comと一致します。

NameVirtualHost *:80

<VirtualHost *:80>
  ServerName domain-one.com
  # Other options and directives ..
</VirtualHost>

<VirtualHost *:80>
  ServerName domain-two.com
  # Other options and directives ..
</VirtualHost>

多くのサーバーにはモノリシック構成ファイルはありませんが、次のように編成されたいくつかのホスト固有の構成ファイルがあります。

/etc/Apache2
|-- sites_available  (actual configuration files)
`-- sites_enabled    (symlinks to files in sites_available)

この場合、特定の仮想ホスト構成を最初にロードするには、シンボリックリンクの名前を00-defaultなどのソート時に最初になる名前に変更します。


他のいくつかの答えはまったく正しくありません。 Apache Wikiによると、 仮想ホストでServerNameを設定しない は正しくありません。 ServerNameのないホストが最初にロードされない場合、最初にロードされたホストがデフォルトであるため、Apacheはそれを使用することさえできません。

さらに、ServerAlias *は実際にはすべてに一致しますが、後で定義される他の仮想ホストをオーバーライドすることもあります。 (この質問で与えられた構成のように)last仮想ホストが常に定義されている場合、このアプローチはうまくいくかもしれませんが、これは新しいディレクティブおよび上記のように順序を変更するだけでなく、並べ替え順序を変更します。

83
Jason Blevins

サーバー名を指定しないでください。これがデフォルトの仮想ホストになります。

<VirtualHost *:80>
ServerAdmin webmaster@localhost

DocumentRoot /var/www
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>
</VirtualHost> 

また、メインのhttpd.confファイルでDocumentRootを指定していないことを確認してください。DocumentRootはvhostsよりも優先されます。

7
Vid Luther

順序は重要です。他のすべてのvhost定義をリストの先頭に移動してください。

3
Ray

ワイルドカードには、サイト構成ファイルが含まれます。

Include path/to/site/confs/*httpd.conf

予想される順序でロードされるように、サイトのconfファイルを整理します。例...

01-httpd.conf

02-site1-httpd.conf

03-site2-httpd.conf

等...

Apacheはこれらを順番に読み取ります。次に、常に最後にロードして、一致しない仮想ホストをキャッチし、デフォルトのサイトをロードする代わりに404を返すものを作成します。

99-catchall-httpd.conf

<VirtualHost *:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost *:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

必ずhttpdがリッスンするポートに置き換えてください。または、特定のインターフェイスでhttpdをリッスンしている場合は、次のように、代わりに各インターフェイスのキャッチオールを追加する必要があります。

<VirtualHost 192.168.1.101:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>
<VirtualHost 192.168.1.101:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

お役に立てれば。この方法を使用して、指定した順序でサイトを読み込み、一致しない仮想ホストが予期しないサイトを意図せずに読み込まないようにします。

2
Jason Slobotski

_default_仮想ホストを使用し、 http://httpd.Apache.org/docs/2.2/vhosts/examples.html で指定されているように、最初にhttpd-vhosts.confに配置します

"指定されていないIPアドレスとポートへのすべての要求をキャッチします。つまり、他の仮想ホストで使用されていないアドレスとポートの組み合わせ[...]デフォルトの仮想ホストは、は名前ベースの仮想ホストに使用されるアドレス/ポートに送信されました。リクエストに不明またはホスト:ヘッダーが含まれていない場合、常にプライマリの名前ベースの仮想ホスト(そのアドレス/ポートの仮想ホストが構成ファイル)」

すべての仮想ホストをたまたまポート80にロックする、ライブだが難読化されたhttpd-vhosts.confからのスニペット:

# Listen for virtual Host requests on all IP addresses.
# This directive cannot be removed:
NameVirtualHost *:80

<VirtualHost _default_:80>
# This vhost catches client requests with Host headers which have
# not been matched by ServerName or ServerAlias directives in other vhosts.
#
# We redirect all such requests to a particular named vhost:
    RewriteCond %{HTTP_Host}    ^(.*)$
    RewriteRule ^(.*)$  http://my.site.of.choice [R=permanent,L]
</VirtualHost>

# Name based vhosts here:
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName  my.other.site
    ServerAlias my.other.site2 my.other.site3
</VirtualHost>

# more vhosts etc...

Vhostマッチングプロセスの詳細な説明は、次の場所にあります。 http://httpd.Apache.org/docs/2.2/vhosts/details.html

2
ErikE

最善の解決策は、「1」で始まるサイト構成ファイルの名前を変更して、最初にロードされ、それがデフォルトのサイトになるようにすることです。

Apache2は、最初にロードされたvhostファイルをデフォルトページとして作成します。

1
xoompa

<VirtualHost *:port>を使用して、気になるホストにServerName/ServerAliasを指定する場合、これは私が実行する必要があったことです。

私の状況での背景:

ISPからの動的IPアドレスを持っているので、私のIPアドレスは動的IPアドレス登録会社(私の場合はnoip.org)に登録されています。私の「ホスト」の1つは、DNS登録でmyabc.example.comとしてHost1.ddns.netを指すCNAMEとして登録する必要がありました。しかし、Host2.ddns.netはそのまま残されました。 myabc.example.comとHost1.ddns.netがsite1に移動し、Host2.ddns.netがサイト2に移動し、IPアドレスを含む他のものがデフォルトに移動するようにしました。

最初に読み取られるconfファイルがデフォルトになります。つまり、000_def.conf001_site1.conf002_site2.conf000_def.confをデフォルトのサイトとしてこの順序で読み取られます。 (注:私の場合、/etc/Apache2/sites-enabledにこれらの「ファイル」があります。これらは実際には/etc/Apache2/sites-availableの実際のconfファイルへの動的リンクです)

ServerNameは001_site1.confおよび002_site2.confで使用されているため、000_def.confでも何かに設定する必要があります。

# 000_def.conf:
<VirtualHost *:80>  
ServerName null
# NOTE: DO NOT USE "ServerAlias *" this seems to override the other conf files.
</VirtualHost>


# 001_site1.conf
<VirtualHost *:80>  
ServerName myabc.example.com
ServerAlias mylocalhostname Host1.ddns.net
</VirtualHost>


# 002_site2.conf:
<VirtualHost *:80>  
ServerName Host2.ddns.net
</VirtualHost>
0
alan