nginx和星号server_name?

时间:2013-05-30 16:16:42

标签: nginx

有没有办法将所有流量代理到某个服务器,除非域名不同?

*属性基本上是server_name

server {
  listen 80;
  server_name foo.com
}

server {
  listen 80;
  server_name *
}

或者,有没有办法设置“默认”服务器,如果没有其他特定服务器配置匹配,它会使用它吗?

4 个答案:

答案 0 :(得分:8)

您不能将*用于server_name。来自documentation

  

通配符名称可能只在名称的开头或结尾包含星号,并且只在点边框上包含星号。

但是,您可以使用正则表达式:

server {
    server_name   ~^(www\.)?(.+)$;

    location / {
        root   /sites/$2;
    }
}

答案 1 :(得分:7)

正如@Valery Viktorovsky的回答所说,你不能用* server_name。您可以将server块指定为“默认”,以接收与其他任何不匹配的所有请求。有关说明,请参阅this post。它看起来像这样:

server {
    listen 80 default_server;
    server_name wontmatch.com; # but it doesn't matter
}

有关详情,请参阅the docs for server_name

答案 2 :(得分:2)

只需快速更新..根据通配符现在可以正常工作的文档:http://nginx.org/en/docs/http/server_names.html

答案 3 :(得分:1)

仅供参考,对于像我这样寻找不同内容的人,以下配置将监听并响应所有端口80请求,无论您使用IP还是URL(AKA所有内容):

server {
    listen 80 default_server;
    server_name _;
...
}

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

  

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

     

服务器{       listen 80 default_server;       服务器名称 _;       返回444;这个名字没什么特别的,......

sudo service nginx restart... start,当/etc/nginx/sites-enabled/default符号链接仍然有效时,您会收到错误,因为它使用相同的匹配模式。只需删除该链接,一切都应该有效。