我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

苏南大叔来聊一个非常实用的nginx配置。目前,一般的网站都是买个虚机的服务器,然后一个服务器上面放置多个站点。那么,这种情况下,如果忘了配置某个站点的根目录,对应的域名流量就会白白的浪费了。对于,有很多个域名,但是真实站点确没有几个的人来说,这种情况非常常见。

苏南大叔:nginx如何配置域名未匹配站点,以捕获所有流量? - nginx-default-site
nginx如何配置域名未匹配站点,以捕获所有流量?(图3-1)

本文测试环境:宝塔面板@7.5.2nginx@1.18.0。本文虽然是基于宝塔面板的,但是适用于所有的nginx容器的情况。

背景提示

苏南大叔在这里以宝塔面板为例,说明如何截获这种自然流量。首先前提是:所有站点都是设置了vhost的,在vhost目录下面的所有配置文件都是可以生效的。一个配置文件放进去,nginx做个reload操作,就可以生效了。

上述背景知识,如果不晓得话,可以参考苏南大叔的下面的文章链接:

苏南大叔:nginx如何配置域名未匹配站点,以捕获所有流量? - default-site-conf
nginx如何配置域名未匹配站点,以捕获所有流量?(图3-2)

匹配所有未匹配站点

vhost目录下面,(宝塔的路径是:/www/server/panel/vhost/nginx),放置一个0.default.conf文件,名字其实不重要。但是,有个排序的意义在里面。(这里,大家可以联想一下,是不是有些人的微信名都是要强加个a字符?这里是一样的道理。)

配置的内容是:

server
{
    listen 80;
    server_name _;
    index index.html;
    root /www/server/nginx/html;
    error_page 404 /404.html;
    # error_page 404 = http://www.baidu.com/error.html;
}

这个配置的内容,是苏南大叔修改过的。里面制定了server_name _,这里其实制定为啥乱七八糟的字符串都可以。只要是不匹配,就会走到这里进行处理。当然,使用_来表达的话,即优雅又实用。

这里,先制定了这种情况下的html根目录,同时还制定了最常见的404页面的处理方案。而宝塔默认的html里面,并没有404.html这个文件,所以,您还是可以自己创建一个比较好。或者直接跳转到某个链接地址也是可以的。

443端口

如果再加上捕获443端口的流量的话,配置可以修改成下面的:

server
{
    listen 80;
    listen 443 ssl http2;
    server_name _;
    index index.html;
    root /home/wwwroot/0.default;
    error_page 404 /404.html;
    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    if ($server_port !~ 80){
        rewrite ^(/.*)$ http://$host$1 permanent;
    }
    #HTTP_TO_HTTPS_END
    #error_page 404/404.html;
    ssl_certificate    /www/server/panel/vhost/cert/newsn.net/fullchain.pem;
    ssl_certificate_key    /www/server/panel/vhost/cert/newsn.net/privkey.pem;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    error_page 497  https://$host$request_uri;
    #SSL-END
}

当然,配置中的证书肯定是不生效的。但是,这样配置后,https的流量就可以被捕捉到了,虽然浏览器上还是有特殊的提示信息。但,总归是可以控制这部分流量的走向了。

效果

上述配置文件放置到vhost目录下之后,需要对nginx重新加载配置操作(或者重新启动nginx),就可以生效了。效果就是:任何指向该ip的域名,访问的时候,都会被匹配到该目录下面,并且对于404页面也做了控制。那么一个index.html和一个404.html,就可以写自己的流量控制逻辑了。对吧?

至于具体的流量控制逻辑,就您自己设置吧?下面的截图,是宝塔面板捕获到这种没有绑定站点时的流量时,所显示的界面,你需要做的就是修改这个界面。

苏南大叔:nginx如何配置域名未匹配站点,以捕获所有流量? - nginx-all-ip-fail
nginx如何配置域名未匹配站点,以捕获所有流量?(图3-3)

这个页面的地址也就是nginx的配置中的root字样配置中的地址:

root /www/server/nginx/html;

相关链接

总结

没有被nginx匹配到的域名,该如何处理呢?例如:阿里云说,您的服务器上面有非法的域名(其实是别的域名指向了你的ip),或者很多你的域名指向了一个服务器,但是又懒得配置太多域名。这些类似的问题,都可以在本文中找到答案。

更多nginx的配置小技巧,可以参考苏南大叔的博客:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   nginx