Nginx server_name 通配符或全部通配符

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

到目前为止,我已经尝试将 server_name设置为 *,但作为无效通配符失败。在我添加其他服务器块之前,*.*一直工作,那么我猜它会与它们发生冲突。

在定义了其他站点之后,是否有办法在 nginx 中运行一个 catch-all 服务器块?

注意: 我不是一个垃圾邮件发送者,这些是真正的网站与有用的内容,他们只是由相同的内容管理系统从数据库!

224628 次浏览

在“全部捕获”服务器块中将 listen 选项更改为 this。(添加 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

这将奏效:

server_name ~^(.+)$

按照惯例,下划线用作默认服务器的服务器名称。

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

在“一网打尽”的服务器示例中,可以看到奇怪的名称“ _”:

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

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

注意,server_name _;本身就是 没有。上面的例子仅仅因为 listen指令中的 default_server起作用。

对我来说,某种程度上定义 default _ server 不工作

server_name ~^.*$

使用 all 的正则表达式。

只有一个 server指令

Nginx listen文档

Default _ server 参数(如果存在)将导致服务器 成为指定地址的默认服务器: 端口对。如果没有 指令的参数 default _ server 然后是第一个 服务器的地址: 端口对将是默认的服务器 一对。

如果您只有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,它只是一个 无效域名

现在你可以使用面具:

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


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

看这里: http://nginx.org/en/docs/http/server_names.html

如果您还想捕获带有空 Host头的请求(这在 HTTP/1.0中是允许的) ,那么可以同时使用正则表达式和空 server_name:

server {
listen      80;
server_name ~. "";
}

试试 $http_host

server {
server_name $http_host;
}