我有一个运行nginx的实例,它为多个网站提供服务。第一个是服务器IP地址上的状态消息。第二个是admin.domain.com
上的管理控制台。这些工作很棒。现在,我希望所有其他域请求转到单个index.php
- 我有大量的域和子域,并且在nginx配置中列出它们是不切实际的。
到目前为止,我已尝试将server_name
设置为*
,但作为无效的通配符失败了。 *.*
一直有效,直到我添加其他服务器块,然后我猜它与它们冲突。
在定义了其他网站后,有没有办法在nginx中运行catch-all服务器块?
N.B。我不是垃圾邮件发送者,这些是真正的有用内容的网站,它们只是来自数据库中的同一个CMS!
答案 0 :(得分:127)
在catch-all服务器块中更改listen选项。 (添加default_server
)这将占用所有未定义的连接(在指定端口上)。
listen 80 default_server;
如果您想将所有内容推送到index.php,如果文件或文件夹不存在;
try_files $uri /$uri /index.php;
答案 1 :(得分:49)
答案 2 :(得分:22)
这将有效:
server_name ~^(.+)$
答案 3 :(得分:7)
对我来说,某种程度上定义default_server无效。
解决了这个问题<textarea />
使用所有的正则表达式。
答案 4 :(得分:2)
server
指令default_server参数(如果存在)将导致服务器执行以下操作: 成为指定的address:port对的默认服务器。如果没有 的指令具有default_server参数,然后是第一个 具有address:port对的服务器将是此服务器的默认服务器 对。
如果只有1个server
指令,它将处理所有请求,则无需设置任何内容。
server
指令如果要将所有请求与指定的server
指令匹配,只需将default_server
参数添加到listen
,Nginx将默认使用此server
指令。
server {
listen 80 default_server;
}
server_name _;
在所有服务器示例中,可以看到一个奇怪的名称“ _”:
server { listen 80 default_server; server_name _; return 444; }
这个名字没有什么特别的,它只是无数种之一 永远不会与任何真实名称相交的无效域名。 同样可以使用其他无效名称,例如“-”和“!@#”。
您设置的server_name
并不重要,它只是一个无效的域名。
答案 5 :(得分:1)
现在您可以使用遮罩了:
server {
listen 80;
server_name *.example.org;
...
}
server {
listen 80;
server_name mail.*;
...
}
答案 6 :(得分:0)
如果您还想捕获带有空group=2
标头的请求( HTTP / 1.0 允许),则可以同时使用正则表达式和空Host
:
server_name
答案 7 :(得分:0)
试试$http_host
server {
server_name $http_host;
}