如何阻止没有引荐的 Nginx 请求

如何阻止没有引荐的 Nginx 请求

我有一个网站,有人在未经许可的情况下在移动应用程序中使用它,因为我注意到没有推荐的直接 Android 用户数量大幅增加。我尝试阻止对目录的访问,如下所示:

location /widget/link/ {  if ($http_referer = "") {  return 403; } }

但我注意到,对于其他有推荐的访问者,该 API 不起作用,因为他们会得到 404 错误,日志中出现了这个错误

2019/08/11 12:22:27 [error] 1914#1914: *2417 "/home/site/public/widget/link/index.html" is not found (2: No such file or directory), client: 2.44.127.232, server: domain.com, request: "GET /widget/link/?link=https://example.com

我想防止其他人在移动应用程序中使用我的网站,如何阻止所有没有引用 /widget/link/ 的 Chrome 移动用户?

我的 nginx 配置在这里

        server_name domain.com;
        root /home/domain/public/;
index index.html index.htm index.php;


  location ~ \.php$ {
            try_files $uri =404;
            include /etc/nginx/fastcgi_params;
                 fastcgi_pass unix:/run/php/php7.0-fpm.sock;
           fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;



   }
  location ~ ^/(assets|images|javascripts|stylesheets|system)/ {
      gzip_static on;
      expires     max;
      add_header  Cache-Control public;
      add_header  Last-Modified "";
      add_header  ETag "";
      # open_file_cache          max=1000 inactive=500s;
      # open_file_cache_valid    600s;
      # open_file_cache_errors   on;
      domain;
  }




       location / {



 try_files $uri $uri/ /index.php?$query_string;



}

答案1

看一下如果是邪恶的。总结一下:你不应该if在 inside使用location

if指令只能在上下文中直接安全地使用server {},如果它在其他任何地方就会带来麻烦。

您必须使用map大部分内容编写条件逻辑,然后if在安全上下文中使用。操作方法如下。

map首先,在 中定义s http {}(通常在 中nginx.conf)。变量名称是不言自明的:

http {
    map $http_user_agent $is_android {
      default 0;
      ~Android 1;
    }

    map $http_referer $has_referer {
        default 0;
        ~.      1;
    }

    map $is_android:$has_referer $bad_client {
        default 0;
        1:0     1;
    }
    ...
}

$bad_client现在我们有可用的所需变量,if因此您可以对不良客户端应用限制,如下所示:

server {
    if ($bad_client) {
        return 403; 
    }
    ...
}

去测试:

curl -IL https://example.com/ -H "User-Agent: Android" # will get 403
curl -IL https://example.com/ -H "User-Agent: Android" -H "Referer: foo" # will get 200

相关内容