nginx server_name通配符或catch-all

Tak*_*Tak 105 nginx catch-all server-name

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

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

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

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

Mat*_*ias 134

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

listen       80  default_server;
Run Code Online (Sandbox Code Playgroud)

如果你想将一切都推送到index.php,如果文件或文件夹不存在;

try_files                       $uri /$uri /index.php;
Run Code Online (Sandbox Code Playgroud)

  • HTTPS 的旁注:“default_server”指令还设置将处理该端口上请求的 SSL 握手的服务器。因此,如果您希望服务器块 A 处理 SSL,但服务器 B 充当 HTTPS 的包罗万象,解决方案是在服务器 B 上设置``server_name ~^(.+)$```。 (5认同)

jp.*_*oux 55

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

server_name  _;
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案不正确.该参考文献清楚地表明,除非您的配置中还有`listen 80 default_server`,否则这将无效. (49认同)
  • 该链接仅作为参考提供.上面的两行实际上就是答案:简单地将下划线作为server_name的值将产生所需的"全部捕获"行为. (9认同)
  • 另见[本文](http://blog.gahooa.com/2013/08/21/nginx-how-to-specify-a-default-server/). (5认同)
  • 也许我误解了文档,但是“这个名字没有什么特别之处,它只是无数从不与任何真实名称相交的无效域名之一。其他无效名称,如“--”和“!@#”可能同等使用。”。所以`_`只是一个**无效**名称? (3认同)
  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 (2认同)
  • 是的,*这是一个无效的*配置。它不是通配符。 (2认同)
  • 我想知道当我们有带有“default_server”参数的“listen”指令时,为什么我们需要这个_invalid_配置?`server_name _;` 指令的目的是什么? (2认同)
  • @Psylone您可以省略`server_name`指令。在当前版本的 nginx 中,它将使用空名称 - 这将完美地工作。无效的“server_name”是旧时代的建议:如果“server”块中没有指定“server_name”,则 0.8.48 之前的 nginx 版本将使用您计算机的主机名,这可能是不需要的。将其设置为无效的值可以修复该问题。 (2认同)

com*_*tos 24

这将有效:

server_name ~^(.+)$
Run Code Online (Sandbox Code Playgroud)

  • `server_name~ .`似乎更有效率 (10认同)
  • 这对我有用。无论出于什么原因,我都无法使default_server正常工作,它覆盖了我所有其他的虚拟主机。 (2认同)

Ste*_*ing 11

只有 1 个server指令

来自Nginxlisten文档

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

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


server指令

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

server {
    listen 80 default_server;
}
Run Code Online (Sandbox Code Playgroud)

关于 server_name _;

来自Nginx 文档

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

server {
    listen       80  default_server;
    server_name  _;
    return       444;
}
Run Code Online (Sandbox Code Playgroud)

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

不管server_name你设置了什么,它只是一个无效的域名


小智 10

对我来说,某种程度上定义default_server无法正常工作.我解决了

server_name ~^.*$
Run Code Online (Sandbox Code Playgroud)

使用正则表达式.


red*_*her 9

现在您可以使用掩码:

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

server {
    listen       80;
    server_name  mail.*;
    ...
}
Run Code Online (Sandbox Code Playgroud)

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


Pav*_*bev 5

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

server {
    listen      80;
    server_name ~. "";
}
Run Code Online (Sandbox Code Playgroud)