【问题标题】:Nginx restrict domainsNginx 限制域
【发布时间】:2018-04-24 13:25:36
【问题描述】:

请在我的站点域名下的 /etc/nginx/sites-enabled 中找到以下设置。 (mysite.lk)

server {  
   listen   80;
   server_name mysite.lk www.mysite.lk;

   location / {  
        proxy_set_header   X-Forwarded-For $remote_addr;
        proxy_set_header   Host $http_host;
        proxy_pass "http://127.0.0.1:8080";
   }

} 

应用程序在端口 8080 上运行,在这里我将所有 80 流量重定向到 8080。 我的网站只使用 mysite.lkwww.mysite.lk 域名。

因此,我想限制/阻止所有其他域(mysite.lk 和 www.mysite.lk 除外),这些域将访问此服务器 IP。为了实现这一目标,我需要做哪些改变?

我尝试了很多东西,例如 Why is nginx responding to any domain name?,但在 nginx 启动时出错。

请帮帮我! 谢谢。

更新

找到答案。在给定配置之前的配置顶部应该需要一个包罗万象的服务器块,如下所示。代码块应该是这样的。

server {
    return 403;
}

server {
    listen   80;
    server_name mysite.lk www.mysite.lk;
    location / {
        proxy_set_header   X-Forwarded-For $remote_addr;
        proxy_set_header   Host $http_host;
        proxy_pass "http://127.0.0.1:8080";
   }

}

【问题讨论】:

  • 你需要一个 catch-all 服务器。您的链接答案显示了解决方案。如果您在实施中遇到错误 - 您需要修复它们。从/etc/nginx/nginx.conf 文件开始。您的系统中是否已经定义了任何其他 server 块 - 使用 nginx -T 查看完整图片。
  • 非常感谢!这是服务器块中的错误。还在给定块限制所有其他域之前添加包罗万象的块“server { return 403; }”。
  • 它适用于端口 80 但不适用于 443。任何想法为什么?
  • 是的,它适用于端口 80 但不适用于 443,为什么??
  • @Kornikopic 你找到解决方法了吗?

标签: nginx


【解决方案1】:

如何创建一个没有 server_name 的服务器指令。像这样的

server {
    listen 80 default_server;

    location / {
        deny all;
    }
}

编辑 请阅读http://nginx.org/en/docs/http/request_processing.html 简而言之,当涉及到 server_names 或位置时,nginx 总是寻找最佳匹配,如果找不到,它会使用默认服务器。

【讨论】:

  • 我也看过了。我想拒绝除 mysite.lk 和 www.mysite.lk 之外的所有域。并且流量也必须重定向到 8080 端口。
  • 是的,我明白了。配置旁边的这段配置将完全做到这一点
  • 找到它!请在问题部分找到更新的答案。也感谢您的快速支持。
【解决方案2】:

Nginx 中定义的第一个服务器被视为default_server,因此只需添加一个作为默认值并返回 412(前提条件失败)或任何其他最符合您要求的状态,将有助于后续服务器遵守server_name

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 412;
} 

server {
    listen   80;
    server_name mysite.lk www.mysite.lk;
    location / {
        proxy_set_header   X-Forwarded-For $remote_addr;
        proxy_set_header   Host $http_host;
        proxy_pass "http://127.0.0.1:8080";
   }
}

【讨论】:

  • 你在return 412 后面漏掉了一个分号,除此之外,对我来说效果很好。
【解决方案3】:

以上所有答案都是正确的。但是如果其他域尝试通过端口 443(https/SSL) 访问您的主机,它们都不起作用。

要阻止访问 https 请求,只需在主机的 https 服务器配置中添加一个 if 块。

    server {

        server_name www.xyz.com xyz.com;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
    }


    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot

  if ($host = "www.specificdomainyouwanttoblock.com") {
  return 404;
 }

if ($host = "specificdomainyouwanttoblock.com") {
  return 404;
 }

#or you can simply add:

if ($host != "yourdomain.com") {
  return 404;
 }

}

【讨论】:

    【解决方案4】:

    我有一个带有防火墙的播放器脚本,它阻止不在我的白名单上的网站,但事实证明,如果我激活了防火墙,视频在我的 Android 应用程序中停止工作,他们知道我可以如何修改我的防火墙使用包名称 Android 应用程序将我的应用程序添加到白名单并能够在防火墙处于活动状态的情况下在我的应用程序中播放视频,因为我必须禁用它才能在我的应用程序中播放视频。

    /**
     * Disable access baseed on referer
     */
    if (Data::Get("accs_restriction") == "enable") {
        $domains = explode(",", Data::Get("allowed_domains"));
        $referer = parse_url($_SERVER["HTTP_REFERER"], PHP_URL_HOST);
        if (empty($referer) || !in_array($referer, $domains)) {
            header('HTTP/1.0 403 Forbidden');
            require TEMPLATES . "pages/access_denied.php";
            exit;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 2013-05-14
      • 2021-03-24
      • 2021-03-29
      相关资源
      最近更新 更多