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


67

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>

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

回答:


45

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


動作するはずですが、動作しません。ドメインが具体的にリストされていない場合、「Firefoxはサーバーを見つけることができません」と表示されます。
SJaguar13

2
「ServerName host」および「ServerAlias *」として設定しましたか?元々これを十分に強調していませんでしたが、ServerNameはワイルドカードを使用せず、ServerAliasのみが使用します。ServerNameは実際のホスト名である必要があります。
freiheit

また、他の仮想ホストは機能しますか?どのバージョンのApache?
freiheit

「Firefoxはサーバーを見つけることができません。」Apacheの問題ではありません。詳細が必要です(接続されているサーバーがある場合、エラーコードは何
ですか

奇妙なことに、私にとっては
うまくいき

80

名前ベースの仮想ホストを使用する場合、最初にロードされる仮想ホスト構成がデフォルトになります(ソース: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)

この場合、特定の仮想ホスト構成を最初にロードするには、symlinkの名前を、ソート時に最初になるようなものに変更し00-defaultます。


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

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


+あなたに100万のインターネット 最初にデフォルトにする必要があります。
ライアン

どちらが最初に来るか、httpd.confまたはconf.d / xyz.confを知っていますか?
エサヴァレモ

2
「最初にロードされた仮想ホスト構成がデフォルトになります」XAMPP(Windows)上のローカルSSLドメインの問題を解決しました。Apacheは各ポートのデフォルトとして最初のvhostを使用しているように見えるため、セキュリティで保護されていない/セキュリティで保護された要求の両方に一致しないドメインを適切に処理するには、80/443ポートの2つの明示的な「デフォルト」構成が最初に定義されている必要がありますhttpd-vhosts.conf
Wirone

1
@EsaVaremo-httpd.confが最初にロードされ、conf.d / xyz.conf(またはconf.d / *)をソースとするInclude行が含まれます。Include行の前の設定(vhostsを含む)が最初に処理されます。インクルード行の後は、インクルードファイルの後に処理されます。
ダンプリッツ

7

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

<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を指定していないことを確認してください。vhostsよりも優先されます。


リストにある最初の仮想ホストとしてそれを持っていますが、それでも「Firefoxがサーバーを見つけることができません」というメッセージを受け取ります。
SJaguar13 09年

2
同意しません。ServerNameを使用せずに最初の仮想ホストを設定しましたが、一部の仮想ホストと競合するようですが、他の仮想ホストとは競合しないようです。ServerNameを追加することで問題を解決しましたが、サーバー上にないランダムなドメインに設定しました。これは最初の仮想ホストであるため、デフォルトとして使用されますが、他のServerNameと一致しないドメインが使用されている場合にのみ一致します。
-joshaidan

3

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


2

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

「指定されていないIPアドレスとポート、つまり、他の仮想ホストに使用されていないアドレス/ポートの組み合わせに対するすべてのリクエストをキャッチします。[...]デフォルトのvhostは、名前ベースのvhostsに使用されます。リクエストにHost:ヘッダーが不明または含まれていない場合、常に名前ベースのプライマリvhost(構成ファイルで最初に表示されるアドレス/ポートのvhost)から提供されます。

すべての仮想ホストをポート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
_default_一致しないIPのみに使用されるため、ワイルドカード化されたvhost(*:80)がある場合は使用されません。
Wirone

2

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

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>

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


1

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

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


000-defaultこのため、デフォルトのApacheインストールにも仮想ホストがあります。
vp_arth

0

<VirtualHost *:port>関心のあるホストにServerName / ServerAliasを使用して指定する場合、これが必要でした。

私の状況の背景:

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

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

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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.