155

我有一个正在运行的 nginx 实例,它为多个网站提供服务。第一个是关于服务器 IP 地址的状态消息。第二个是admin.domain.com. 这些效果很好。现在我希望所有其他域请求都转到一个单独index.php的域 - 我有很多域和子域,在 nginx 配置中将它们全部列出是不切实际的。

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

在定义了其他站点之后,有没有办法在 nginx 中运行一个包罗万象的服务器块?

注意我不是垃圾邮件发送者,这些是具有有用内容的真实网站,它们只是由数据库中的同一个 CMS 提供支持!

4

8 回答 8

181

在你的包罗万象的服务器块中将监听选项更改为此。(添加default_server)这将获取所有未定义的连接(在指定端口上)。

listen       80  default_server;

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

try_files                       $uri /$uri /index.php;

根据文档It can also be set explicitly which server should be default, with the **default_server** parameter in the listen directive

于 2012-02-26T16:30:56.730 回答
89

作为约定,下划线用作默认服务器的服务器名称。

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

在包罗万象的服务器示例中,可以看到奇怪的名称“_”:

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

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

请注意,server_name _;仅此一项是不够的。上面的示例仅适用default_serverlisten指令中的原因。

于 2015-05-08T20:05:59.723 回答
35

这将起作用:

server_name ~^(.+)$
于 2014-10-15T13:30:02.603 回答
13

对我来说,以某种方式定义 default_server 不起作用。我解决了

server_name ~^.*$

使用所有的正则表达式。

于 2016-04-08T14:43:39.813 回答
13

只有 1 个server指令

来自Nginxlisten文档

default_server 参数(如果存在)将导致服务器成为指定地址:端口对的默认服务器。如果所有指令都没有 default_server 参数,那么第一个具有 address:port 对的服务器将是该对的默认服务器。

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


server指令

如果你想匹配所有请求与指定server指令,只需添加default_server参数listen,Nginx 将server默认使用该指令。

server {
    listen 80 default_server;
}

关于server_name _;

来自Nginx 文档

在包罗万象的服务器示例中,可以看到奇怪的名称“_”:

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

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

你设置什么都没关系server_name,它只是一个无效的域名

于 2018-07-20T01:48:13.767 回答
10

现在您可以使用掩码:

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

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

在这里查看更多:http: //nginx.org/en/docs/http/server_names.html

于 2018-10-12T13:12:17.830 回答
4

如果您还想捕获带有空Host标头的请求(在HTTP/1.0中允许),您可以同时使用 regex 和 empty server_name

server {
    listen      80;
    server_name ~. "";
}
于 2019-01-25T09:37:28.517 回答
0

尝试$http_host

server {
    server_name $http_host;
}
于 2021-02-22T05:58:23.147 回答