AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 761904
Accepted
Adam Matan
Adam Matan
Asked: 2016-03-07 02:41:39 +0800 CST2016-03-07 02:41:39 +0800 CST 2016-03-07 02:41:39 +0800 CST

Nginx 将未指定的流量路由到看似任意的子域

  • 772

问题

我有一个服务于 3 个子域的 nginx 服务器 - 比如a.example.com,b.example.com和c.example.com.

配置文件分别为a.example.com.conf、b.example.com.conf和c.example.com.conf。它们存储/etc/nginx/sites-available在/etc/nginx/sites-enabled.

在配置文件中,每个server子句都有其相应的server_name指令。如果重要的话,所有三个子域都使用Let's Encrypt 的相同 SSL 证书问题(工作正常)。

当b.example.com.conf从 中删除时sites-enabled,我希望在尝试浏览它时出现错误消息。令人惊讶的是,nginx 将流量重定向到a.example.com. 事实上,每个没有匹配服务器名称的传入连接/etc/nginx/sites-enabled(包括机器 IP)都被路由到a.example.com.

如何配置 nginx 以使server指令独占,以便b.example.com永远不会为请求提供服务a.example.com?

配置

a.example.com.conf

server {
    listen 443 ssl;
    server_name a.example.com;

    ssl_certificate     /etc/letsencrypt/live/a.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/a.example.com/privkey.pem;

    location / {
        proxy_pass http://localhost:8080;
    }
}

b.example.com.conf

server {
    listen 443 ssl;
    server_name b.example.com;

    # I'm using a multi-domain certificate called `a.example.com`, which is
    # serving a.example.com, b.example.com and c.example.com - not an error

    ssl_certificate     /etc/letsencrypt/live/a.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/a.example.com/privkey.pem;

    location / {
        proxy_pass http://localhost:8090;
    }
}

临时解决方案

我创建了一个默认服务器,它捕获所有默认请求并返回错误 404。但是,我希望有一个更全面的解决方案,以防止来自另一台服务器服务的任何给定服务器的请求。

server {
    listen       443  default_server;
    server_name  _;
    return       404;

    ssl_certificate     /etc/letsencrypt/live/a.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/a.example.com/privkey.pem;
}
nginx
  • 1 1 个回答
  • 145 Views

1 个回答

  • Voted
  1. Best Answer
    Guido Vaccarella
    2016-03-07T03:42:11+08:002016-03-07T03:42:11+08:00

    来自 nginx文档:

    在此配置中,nginx 仅测试请求的标头字段“Host”,以确定应将请求路由到哪个服务器。如果它的值不匹配任何服务器名称,或者请求根本不包含这个头域,那么 nginx 会将请求路由到这个端口的默认服务器。在上面的配置中,默认服务器是第一个——这是 nginx 的标准默认行为。

    因此,您的临时解决方案似乎是正确的解决方案。

    • 5

相关问题

  • Gzip 与反向代理缓存

  • nginx 作为代理的行为

  • Nginx 学习资源 [关闭]

  • 提供 70,000 个静态文件 (jpg) 的最佳方式?

  • 在 Apache、LightTPD 和 Nginx Web 服务器上提供 PHP 5.x 应用程序的现状?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve