2012-02-26 54 views
68

我有一個nginx運行的實例,它服務於多個網站。第一個是服務器IP地址上的狀態消息。第二個是admin.domain.com上的管理控制檯。這些工作很好。現在我希望所有其他域請求都可以使用index.php - 我有大量的域和子域名,將它們全部列在nginx配置中是不切實際的。nginx server_name通配符或全部收集

到目前爲止,我已經嘗試設置server_name*但未能作爲一個無效的通配符。 *.*的作品,直到我添加其他服務器塊,然後我猜它與他們衝突。

是否有辦法在定義其他站點後運行nginx中的全部服務器塊?

N.B.我不是垃圾郵件發送者,這些網站是有用內容的真正網站,它們只是由數據庫中的同一個CMS提供支持!

回答

101

在您的全部服務器塊中更改監聽選項。 (添加default_server)這將取得所有未定義的連接(在指定的端口上)。

listen  80 default_server; 

如果您想要將所有內容都推送到index.php文件或文件夾不存在;

try_files      $uri /$uri /index.php; 
+0

工作完美 - 非常感謝。我無法使用'server_name _;'作爲IP地址的狀態頁面,我不得不指定'server_name x.x.x.x'但沒關係! – Tak 2012-02-26 17:11:38

+0

添加'default_server'似乎不適用於nginx 1.4.6,這是目前Ubuntu 14.04上的最新版本......當我添加它時,'configtest'命令返回一個錯誤,並且重新啓動服務器不起作用無論是。我已經用Debian jessie在我的服務器上嘗試了完全相同的配置,它具有nginx 1.6.2,並且它完美地工作。因此,如果您使用的是1.4.6,請嘗試另一個版本... – Nicomak 2016-02-22 03:21:17

+0

HTTPS的注意事項:default_server'指令還設置將處理該端口上的請求的SSL握手的服務器。因此,如果您希望服務器塊A處理SSL,但服務器B充當HTTPS的catchall,則解決方案是在服務器B上設置server_name〜^(。+)$'''。 – Luke 2017-03-20 06:16:34

19

這將工作:

server_name ~^(.+)$ 
+6

'server_name〜 .'似乎更有效 – zhangyoufu 2016-04-10 05:55:09

+1

這對我有用。無論出於何種原因,我無法讓default_server工作,它覆蓋了我所有的其他虛擬主機。 – NeuroXc 2016-09-28 03:49:34

34

一個簡單的下劃線的作品,以及:

server_name _; 

來源:http://nginx.org/en/docs/http/server_names.html

+0

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – Kmeixner 2015-05-08 20:27:20

+6

該鏈接僅作爲參考提供。上面的兩行實際上是答案:只要將一個下劃線作爲server_name的值就會產生所需的「全部捕獲」行爲。 – 2015-05-09 21:31:42

+25

此答案不正確。該參考清楚地表明,除非您在配置中還有'listen 80 default_server',否則這將不起作用。 – Beetle 2015-06-12 09:35:50

3

對我來說,在某種程度上定義default_server不能正常工作。我通過

server_name ~^.*$ 

使用所有的正則表達式來解決它。

+0

嘗試所有更高的投票選項,這是唯一的工作。注意:我試圖通過IP地址與URL訪問服務器。 – Mampersat 2016-07-20 23:03:42