Nginx限制域

时间:2017-11-11 11:57:44

标签: nginx

请在我的网站域名下找到以下设置,该设置位于 / 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.lk www.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";
   }

}

4 个答案:

答案 0 :(得分:2)

Nginx中定义的第一台服务器被视为default_server,因此只需添加一个作为默认值并返回412(Precondition Failed)或任何其他最符合您要求的状态,将有助于后续服务器服从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";
   }
}

答案 1 :(得分:0)

如何在没有server_name的情况下创建服务器指令。像这样的东西

server {
    listen 80 default_server;

    location / {
        deny all;
    }
}

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

答案 2 :(得分:0)

以上所有答案均正确。但是,如果另一个域尝试通过端口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;
 }

}

答案 3 :(得分:0)

我有一个带防火墙的播放器脚本,该脚本阻止了不在白名单上的网站,但事实证明,如果激活了防火墙,则视频在我的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;
    }
}