nginx服务器\u名称通配符或全包

nginx服务器\u名称通配符或全包,nginx,catch-all,server-name,Nginx,Catch All,Server Name,我有一个运行nginx的实例,它服务于多个网站。第一个是服务器IP地址上的状态消息。第二个是admin.domain.com上的管理控制台。这些很好用。现在,我希望所有其他域请求都转到单个index.php——我有大量的域和子域,在nginx配置中列出它们是不切实际的 到目前为止,我已经尝试将server\u name设置为*,但由于无效的通配符而失败*.在我添加其他服务器块之前有效,然后我猜它与它们冲突 在定义了其他站点之后,是否有办法在nginx中运行catch-all服务器块 注意,我不是

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

到目前为止,我已经尝试将
server\u name
设置为
*
,但由于无效的通配符而失败<代码>*.在我添加其他服务器块之前有效,然后我猜它与它们冲突

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


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

将“全部捕获”服务器块中的“侦听”选项更改为该选项。(添加
default\u server
)这将占用所有未定义的连接(在指定端口上)

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

try_files                       $uri /$uri /index.php;
根据,
还可以通过listen指令中的**default\u server**参数明确设置默认服务器

这将起作用:

server_name ~^(.+)$

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

在catch all服务器示例中,可以看到奇怪的名称“\u1”:

server {
   listen       80  default_server;
   server_name  _;
   return       444;
}
server {
    listen       80  default_server;
    server_name  _;
    return       444;
}
这个名字没有什么特别之处,它只是无数>无效域名中的一个,这些域名从不与任何真实名称相交。也可以使用其他>无效名称,如“-”和“!@#”


请注意,
server\u name本身是不够的。上述示例之所以有效,是因为
listen
指令中的
default\u server

对我来说,define default\u server不起作用。我用计算机解决了它

server_name ~^.*$
使用all的正则表达式。

仅1
server
指令 从

默认的_server参数(如果存在)将导致服务器 成为指定地址:端口对的默认服务器。如果没有 其中一个指令具有默认的_server参数,然后是第一个 具有地址:端口对的服务器将是此服务器的默认服务器 配对

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


多个
服务器
指令 如果要将所有请求与指定的
server
指令匹配,只需将
default\u server
参数添加到
listen
,Nginx将使用此
server
指令作为默认指令

server {
    listen 80 default_server;
}

关于
server\u name\u

在catch all服务器示例中,可以看到奇怪的名称“\u1”:

server {
   listen       80  default_server;
   server_name  _;
   return       444;
}
server {
    listen       80  default_server;
    server_name  _;
    return       444;
}
这个名字没有什么特别之处,它只是众多名字中的一个 不与任何真实名称相交的无效域名。 也可以使用其他无效名称,如“-”和“!@#”

无论您设置了什么
服务器名
,它只是一个无效域名

现在您可以使用掩码:

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

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

查看此处的更多信息:

如果您还希望捕获带有空
主机
头的请求(HTTP/1.0中允许使用此头),则可以同时使用regex和空
服务器名称

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

尝试
$http\u主机

server {
    server_name $http_host;
}

非常好,非常感谢。我无法使用
server\u name
对于IP地址上的状态页面,我必须指定
服务器名称x.x.x.x
,但这没关系!添加
default\u服务器
在nginx 1.4.6上似乎不起作用,nginx 1.4.6目前是Ubuntu 14.04的最新版本。。。添加它时,
configtest
命令返回一个错误,重新启动服务器也不起作用。我用Debian jessie在我的服务器上尝试了完全相同的配置,它有nginx 1.6.2,并且工作得非常好。因此,如果您使用的是1.4.6,请尝试另一个版本……HTTPS的旁注:
default\u server
指令还设置了将处理该端口上请求的SSL握手的服务器。因此,如果您希望服务器块A处理SSL,而服务器B充当HTTPS的catchall,那么解决方案是在服务器B上设置
server\u name~ ^(+.+)$
。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。该链接仅作为参考提供。上面的两行实际上就是答案:简单地将下划线作为server_name的值将产生所需的“catch all”行为。这个答案不是真的。参考资料清楚地表明,除非你的配置中也有
listen 80 default\u server
,否则这将不起作用。另请参见。也许我误解了文档,但“这个名称没有什么特别之处,它只是无数无效域名中的一个,从不与任何真实名称相交。其他无效名称如“-”和“!@#”可以同样使用。”因此,
\u
只是一个无效的名称?
服务器名称~。
似乎更有效。这对我来说更有效。无论出于何种原因,我无法让默认服务器工作,它覆盖了我的所有其他vHost。尝试了所有投票率更高的选项,这是唯一有效的。注意:我正在尝试使用它的IP地址和URL访问服务器。最好将其用作主要来源