我有一个网站,有人在未经许可的情况下在移动应用程序中使用它,因为我注意到没有推荐的直接 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