Nginx限制域

vh0rcniy  于 12个月前  发布在  Nginx
关注(0)|答案(5)|浏览(146)

请在我的网站域名下的**/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启动时出现了错误。
帮帮忙!谢谢。

更新

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

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";
   }

}

cyej8jka

cyej8jka1#

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";
   }
}

字符串

li9yvcax

li9yvcax2#

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

}

字符串

iecba09b

iecba09b3#

创建一个没有server_name的server指令怎么样

server {
    listen 80 default_server;

    location / {
        deny all;
    }
}

字符串
编辑请阅读http://nginx.org/en/docs/http/request_processing.html简而言之,nginx总是在服务器名称或位置方面寻找最佳匹配,如果找不到,则使用默认服务器。

wlzqhblo

wlzqhblo4#

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

字符串

nhaq1z21

nhaq1z215#

我在站点的虚拟主机文件中实现了以下行:

if ($http_referer ~* (example\.com)) {
    return 403;
}

字符串
对我很有效。

相关问题