web-dev-qa-db-ja.com

動的マス仮想ホスティングでサイトが見つからず、ページが見つかりません

最近、Apacheで mass virtual hosting を設定したので、新しいvhostを作成するためのディレクトリを作成するだけです。次に、ワイルドカードDNSを使用して、すべてのサブドメインをApacheインスタンスを実行しているサーバーにマップします。

これはうまく機能しますが、vhostディレクトリが存在しない場合に適切なデフォルト/エラーページにフェイルオーバーするように構成するのに問題があります。

この問題は、次の2つのエラー状態を処理したいという私の願望によって混同されているようです。

  1. vhostが見つかりません。つまり、HTTPホストヘッダーで指定されたホストに一致するディレクトリが見つかりませんでした。適切なサイトが見つかりませんというエラーページを表示したいのですが。
  2. Vhostの404ページが見つからない状態。

さらに、独自のvhostブロックに特殊な「api」仮想ホストがあります。

私はいくつかのバリエーションを試しましたが、どれも私が望む動作を示していないようです。これが私が今取り組んでいるものです:

NameVirtualHost *:80
<VirtualHost *:80>
    DocumentRoot /var/www/site-not-found
    ServerName sitenotfound.mydomain.org

    ErrorDocument 500 /500.html
    ErrorDocument 404 /500.html
</VirtualHost>

<VirtualHost *:80>
    ServerName api.mydomain.org
    DocumentRoot /var/www/vhosts/api.mydomain.org/current
    # other directives, e.g. setting up passenger/Rails etc...
</VirtualHost>

<VirtualHost *:80>
    # get the server name from the Host: header
    UseCanonicalName Off
    VirtualDocumentRoot /var/www/vhosts/%0/current
    # other directives ... e.g proxy passing to api etc...
    ErrorDocument 404 /404.html
</VirtualHost>

私の理解では、最初の仮想ホストブロックがデフォルトとして使用されるので、これをキャッチオールサイトとしてここに持っています。次に、API仮想ホストがあり、最後に大量の仮想ホストブロックがあります。

したがって、最初の2つのServerNameと一致せず、/var/www/vhosts/に対応するディレクトリがないドメインの場合、最初の仮想ホストにフォールオーバーすると予想されますが、この設定では、すべてのドメインがデフォルトサイトに解決されます-見つかりません。どうしてこれなの?

Mass-vhostブロックを最初に配置することで、mass-vhostsを適切に解決できますが、サイトが見つからないvhostは解決できません...この場合、ページを区別する方法が見つからないようです。 -vhostのレベル404、およびVirtualDocumentRootがvhostディレクトリを見つけられなかった場合(これも404を使用しているようです)。

このバインドからの助けは大歓迎です!

2
Rick Moynihan

最初の仮想ホストにフォールオーバーすると思いますが、この設定では、すべてのドメインがデフォルトのサイトに解決されます-見つかりません。どうしてこれなの?

異なる仮想ホスト間にフェイルオーバーロジックはありません。リクエストが1つに割り当てられると、それが最終的なものになります。

動的仮想ホストブロックにServerNameまたはServerAliasがない場合、その仮想ホストにリクエストを割り当てるには、「最初にロードする仮想ホストがデフォルト」の動作に依存します。ロードする最初の仮想ホストではない場合、本質的に不活性です。リクエストを取得する方法はありません。


これを処理する方法についての私の推奨事項は、404のバリアントではなく、プロキシまたは作業サイトへのリダイレクト(「ここにコンテンツがありません!」ページを提供します)のいずれかにすることです。ページ。

sitenotfound.mydomain.org vhostを下に移動し、動的なvhostを一番上に戻して、デフォルトにします。これを使用して、フレンドリーな「ここにサイトがありません」ページを提供します。

次に、動的仮想ホストに、サイトからコンテンツを提供する前にサイトが存在するかどうかを確認する機能を与えましょう。その仮想ホスト内に追加:

RewriteEngine On
# If there's no directory where it should be for this Host..
RewriteCond /var/www/vhosts/%{HTTP_Host} !-d
# (or a symlink, we'll be ok with those too)
RewriteCond /var/www/vhosts/%{HTTP_Host} !-l

# Then, we'll redirect the user to our friendly "no site here" page..
# Note that I'm setting it to 302 so that they won't be cached, since
# you might trigger this accidentally just before a new site goes live..
RewriteRule ^ http://sitenotfound.mydomain.org/invalid-site.html [R=302,L]

# Or if you wanted to proxy instead of redirecting, use this instead:
#RewriteRule ^ http://sitenotfound.mydomain.org/invalid-site.html [P,L]

そのため、動的ホストは、コンテンツを提供する前にサイトディレクトリの存在を確認し、ユーザーをわかりやすい説明ページにリダイレクトまたはプロキシします。この動作は、ニーズに合うように聞こえますか?

1
Shane Madden