nginx server_name通配符或catch-all

时间:2012-02-26 16:23:13

标签: nginx catch-all server-name

我有一个运行nginx的实例,它为多个网站提供服务。第一个是服务器IP地址上的状态消息。第二个是admin.domain.com上的管理控制台。这些工作很棒。现在,我希望所有其他域请求转到单个index.php - 我有大量的域和子域,并且在nginx配置中列出它们是不切实际的。

到目前为止,我已尝试将server_name设置为*,但作为无效的通配符失败了。 *.*一直有效,直到我添加其他服务器块,然后我猜它与它们冲突。

在定义了其他网站后,有没有办法在nginx中运行catch-all服务器块?

N.B。我不是垃圾邮件发送者,这些是真正的有用内容的网站,它们只是来自数据库中的同一个CMS!

8 个答案:

答案 0 :(得分:127)

在catch-all服务器块中更改listen选项。 (添加default_server)这将占用所有未定义的连接(在指定端口上)。

listen       80  default_server;

如果您想将所有内容推送到index.php,如果文件或文件夹不存在;

try_files                       $uri /$uri /index.php;

答案 1 :(得分:49)

一个简单的下划线也适用:

server_name  _;

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

答案 2 :(得分:22)

这将有效:

server_name ~^(.+)$

答案 3 :(得分:7)

对我来说,某种程度上定义default_server无效。

解决了这个问题
<textarea />

使用所有的正则表达式。

答案 4 :(得分:2)

仅1个server指令

来自Nginx listen Docs

  

default_server参数(如果存在)将导致服务器执行以下操作:   成为指定的address:port对的默认服务器。如果没有   的指令具有default_server参数,然后是第一个   具有address:port对的服务器将是此服务器的默认服务器   对。

如果只有1个server指令,它将处理所有请求,则无需设置任何内容。


多个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;
}
     

这个名字没有什么特别的,它只是无数种之一   永远不会与任何真实名称相交的无效域名。   同样可以使用其他无效名称,例如“-”和“!@#”。

您设置的server_name并不重要,它只是一个无效的域名

答案 5 :(得分:1)

现在您可以使用遮罩了:

server {
    listen       80;
    server_name  *.example.org;
    ...
}

server {
    listen       80;
    server_name  mail.*;
    ...
}

在此处查看更多信息:enter image description here

答案 6 :(得分:0)

如果您还想捕获带有空group=2标头的请求( HTTP / 1.0 允许),则可以同时使用正则表达式和空Host

server_name

答案 7 :(得分:0)

试试$http_host

server {
    server_name $http_host;
}