访问通过CNAME映射的二级域名,nginx返回欢迎页?

情况是这样的,如aaa.com表示主站,bbb.aaa.com是一个子站点,现在我在腾讯云上通过CNAME把ccc.com映射到了bbb.aaa.com,然而访问ccc.com却没有跳转到bbb.aaa.com。后台用了nginx做代理,具体配置如下

server {
    listen 8081;
    server_name *.aaa.com;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        if ($host = 'aaa.com') {
            proxy_pass http://127.0.0.1:8000;
        }

        if ($host = 'www.aaa.com') {
            proxy_pass http://127.0.0.1:8000;
        }

        if ($host ~ ^(\b(?!www\b)\w+).aaa.com$) {
            proxy_pass http://127.0.0.1:8080;
        }
    }
}

访问ccc.com返回的是nginx的欢迎页,第一次搞nginx不太了解
图片描述

阅读 10.4k
2 个回答
  1. 把ccc.com CNAME到bbb.aaa.com,Host就应该是bbb.aaa.com才对,所以只要给bbb.aaa.com留一条适配规则就行了
  2. 建议把aaa.com CNAME到www.aaa.com,这样可以少写个通用适配的判断逻辑(不然还得判断aaa.com就是默认指向www.aaa.com的会很烦,不如交给域名解析搞)
  3. Nginx配置里,尽量避免用if指令,这是官方也认可的最佳实践。当然如果你要写Lua脚本啥的另说~
  4. 看你题目里listen给的是8081端口不知道什么意思,一般网页默认是在80端口上
  5. 下边第二条是看你原配置写的,其实我个人更喜欢精准命中(即直接写“bbb.aaa.com”而不是用通配符)

下边写了套,你试下(个别没跑过不知道效果):

events {
    use epoll;
}

http {
    # 公有部分提取(向下级扩展)
    proxy_set_header Host $host;
    proxy_set_header X-Real-Ip $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
    server {
        listen 80;
        server_name www.aaa.com;
        proxy_pass http://127.0.0.1:8000; # 转发模式
    }
    server {
        listen 80;
        server_name *.aaa.com; # 如果前一条不能命中(二级前缀不是www),则本条做通用适配
        proxy_pass http://127.0.0.1:8080;
    }
}

参考:
专题 | Jerry Qu的小站
nginx之proxy_pass指令完全拆解

1.我按照你给的写法重新改了配置,现在访问ccc.com直接跳转到了aaa.com,但是直接访问bbb.aaa.com是可以成功访问到的,CNAME解析之后难道是通过ip去访问吗,因为我的aaa.com站点和bbb.aaa.com站点在同一个服务器上。

  1. 8081端口主要是目前测试用的
  2. 用通配符原因是,需要解析二级域名是不固定的,数量会增加。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏