Nginx server_name通配符或全部


118

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

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

在定义了其他站点之后,是否可以在nginx中运行一个包罗万象的服务器块?

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


1
最好将其用作主要来源nginx.org/en/docs/http/server_names.html
Stephen

Answers:


147

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

listen       80  default_server;

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

try_files                       $uri /$uri /index.php;

工作完美-非常感谢。我无法server_name _;指定IP地址上的状态页面,我必须指定,server_name x.x.x.x但是没关系!

1
default_server在nginx 1.4.6(当前是Ubuntu 14.04的最新版本)上,添加似乎不起作用。添加时,configtest命令返回错误,并且重新启动服务器也不起作用。我已经使用Debian jessie在服务器上尝试了完全相同的配置,该服务器具有nginx 1.6.2,并且运行良好。因此,如果您使用的是1.4.6版本,请尝试其他版本...
Nicomak

1
HTTPS的附带说明:该default_server指令还设置将处理该端口上的SSL握手请求的服务器。因此,如果您希望服务器块A处理SSL,而服务器B充当HTTPS的包罗万象,则解决方案是server_name ~^(.+)$在服务器B 上设置
Luke

66

一个简单的下划线也可以:

server_name  _;

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


2
尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能无效。
Kmeixner,2015年

10
该链接仅供参考。上面的两行实际上是答案:将下划线作为server_name的值将产生所需的“全部捕获”行为。
jp.gouigoux,2015年

55
这个答案是不正确的。该参考明确指出,除非您也有listen 80 default_server配置,否则这将无法工作。
甲虫,2015年

5
另请参阅本文
甲壳虫2015年

2
也许我误解了文档,但是“此名称没有什么特别之处,它只是无数的无效域名之一,从未与任何真实名称相交。其他无效名称(例如“-”和“!@#”)可能同样被使用。”。那_是一个无效的名字吗?
Florian Klein'Mar

26

这将起作用:

server_name ~^(.+)$

13
server_name ~.似乎更有效
youfu

2
这对我有用。无论出于什么原因,我都无法使default_server正常工作,它覆盖了我所有其他的虚拟主机。
NeuroXc

11

对我来说,定义default_server无法正常工作。我解决了

server_name ~^.*$

使用所有的正则表达式。


尝试了所有获得较高票数的选择,这是唯一可行的选择。注意:我正在尝试使用IP地址和URL来访问服务器。
Mampersat '16

9

仅1 server条指令

来自Nginx listenDocs

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设置的内容无关紧要,只是一个无效的域名



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.