nginx server_nameワイルドカードまたはキャッチオール


118

複数のウェブサイトにサービスを提供するnginxのインスタンスが実行されています。1つ目は、サーバーのIPアドレスに関するステータスメッセージです。2つ目はの管理コンソールadmin.domain.comです。これらは素晴らしい働きをします。今、私は他のすべてのドメイン要求が単一に行くindex.phpことを望みます-私はたくさんのドメインとサブドメインを持っていて、それらをすべてnginx設定にリストすることは非現実的です。

これまでに設定server_nameを試みました*が、無効なワイルドカードとして失敗しました。*.*他のサーバーブロックを追加するまで機能し、それからそれらが競合すると思います。

他のサイトが定義された後、nginxでキャッチオールサーバーブロックを実行する方法はありますか?

注:私はスパマーではありません。これらは有用なコンテンツを含む本物のサイトであり、データベースからの同じCMSを利用しているだけです。


1
主なソースとしてこれを使用するのが最適nginx.org/en/docs/http/server_names.html
スティーブン

回答:


147

キャッチオールサーバーブロックで、listenオプションをこれに変更します。(追加default_server)これは、(指定されたポートで)定義されていないすべての接続を取得します。

listen       80  default_server;

ファイルまたはフォルダーが存在しない場合にすべてをindex.phpにプッシュする場合。

try_files                       $uri /$uri /index.php;

完璧に動作しました-ありがとうございました。server_name _;IPアドレスのステータスページには使用できませんでした。指定する必要server_name x.x.x.xがありましたが、問題ありません。
Tak

1
追加default_serverは、現在Ubuntu 14.04の最新バージョンであるnginx 1.4.6では機能しないようです。追加すると、configtestコマンドがエラーを返し、サーバーの再起動も機能しません。私は自分のサーバーでDebian jessieとまったく同じ構成を試しましたが、nginx 1.6.2があり、完全に機能します。1.4.6を使用している場合は、別のバージョンを試してください...
Nicomak

1
HTTPSに関する注意事項:このdefault_serverディレクティブは、そのポートでのリクエストのSSLハンドシェイクを処理するサーバーも設定します。だから、あなたはHTTPSのためのキャッチオールとして機能するようにハンドルSSLにサーバブロックAをしたいが、サーバBならば、解決策はセットにあるserver_name ~^(.+)$サーバBに
ルーク

66

単純なアンダースコアも機能します:

server_name  _;

ソース:http : //nginx.org/en/docs/http/server_names.html


2
このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。
Kmeixner、2015年

10
リンクは参照として提供されています。上記の2行が実際の答えです。server_nameの値としてアンダースコアを置くだけで、目的の「すべてをキャッチ」する動作が生成されます。
jp.gouigoux

55
この答えは正しくありません。リファレンスはlisten 80 default_server、あなたがあなたの設定にも持っていなければこれが機能しないことを明らかにします。
ビートル


2
ドキュメントを誤解したかもしれませんが、「この名前について特別なことは何もありません。実際の名前と交差することのない無数の無効なドメイン名の1つにすぎません。「-」や「!@#」などの他の無効な名前は、同様に使用されます。」では_無効な名前だけですか?
フロリアンクライン

26

これは動作します:

server_name ~^(.+)$

13
server_name ~.より効率的であるようです
youfu

2
これでうまくいきました。何らかの理由でdefault_serverを機能させることができなかったため、他のすべての仮想ホストが上書きされていました。
NeuroXc 2016

11

私にとってどういうわけかdefault_serverが機能していないと定義します。私はそれを解決しました

server_name ~^.*$

すべての正規表現を使用します。


上位投票オプションをすべて試しましたが、これが機能した唯一のオプションです。注:IPアドレスとURLを使用してサーバーにアクセスしようとしています。
2016

9

1つのserver指令のみ

Nginx Docsからlisten

default_serverパラメータが存在する場合、サーバーは指定されたアドレスとポートのペアのデフォルトサーバーになります。どのディレクティブにもdefault_serverパラメーターがない場合、address:portペアを持つ最初のサーバーがこのペアのデフォルトサーバーになります。

serverディレクティブが1つしかなく、すべてのリクエストを処理する場合は、何も設定する必要はありません。


複数のserverディレクティブ

すべてのリクエストを指定したserverディレクティブと一致させたい場合は、default_serverパラメーターをlistenに追加するだけで、Nginxはこのserverディレクティブをデフォルトとして使用します。

server {
    listen 80 default_server;
}

server_name _;

Nginx Docsから

キャッチオールサーバーの例では、奇妙な名前「_」が見られます。

server {
    listen       80  default_server;
    server_name  _;
    return       444;
}

この名前について特別なことは何もありません。これは、実際の名前と決して交差しない無数の無効なドメイン名の1つにすぎません。「-」や「!@#」などの他の無効な名前も同様に使用できます。

server_nameを設定してもかまいません。無効なドメイン名です。



2

空のHostヘッダー(HTTP / 1.0で許可されている)を持つ要求もキャッチしたい場合は、正規表現と空の両方を使用できますserver_name

server {
    listen      80;
    server_name ~. "";
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.