如何阻止 http_referer 与请求的 URL 匹配的 Nginx 请求

Posted

技术标签:

【中文标题】如何阻止 http_referer 与请求的 URL 匹配的 Nginx 请求【英文标题】:How to block Nginx requests where http_referer matches requested URL 【发布时间】:2021-04-16 23:16:42 【问题描述】:

我试图阻止一个使用请求的页面作为 http_referer 的网络爬虫,但我无法确定将其与哪个变量进行比较。

例如

location / 
  if ($the_variable_with_the_current_full_uri = $http_referer) 
    return 403;
  

该变量必须匹配协议、主机和 URL,这样从 http 到 https 的内部重定向不会被阻止。

所以如果有人用“https://www.example.com/pages/1”的$http_referer请求“https://www.example.com/pages/1”,就应该被屏蔽。

作为第二个问题,是否可以在两个条件下阻止请求:上述检查匹配的位置以及匹配特定的用户代理字符串?

【问题讨论】:

【参考方案1】:

可以通过将多个变量连接在一起来构造完整的 URL。

例如:

$scheme://$host$request_uri

可以使用map 处理次要条件(请参阅this document)。

例如:

map $http_user_agent $my_http_referer 
    default      "";
    blahblah     $http_referer;

server 
    ...
    if ($scheme://$host$request_uri = $my_http_referer)  return 403; 
    ...

【讨论】:

太好了,我试试看。有趣的是,没有代表完整 URL 的内置变量。我什至在 nginx 网站上都找不到可用变量的列表。另外,必须检查“blahblah”是否可以引用并按原样输入,或者我是否必须转义字符串... 我发现this website 很有用。请参阅页面下方的“按字母顺序排列的变量索引”。 请参阅我的答案中链接的map 文档,但您可能希望使用正则表达式来匹配部分字符串。

以上是关于如何阻止 http_referer 与请求的 URL 匹配的 Nginx 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 CORS 策略阻止从本地主机到第三方 API 的请求?

.htaccess bot阻止和图像窃取

如何阻止机器人对与 Apache 中的常见模式匹配的 URL 的请求?

如何通过阻止实时过滤功能来减少Power BI请求到数据库的数量

HTTP_REFERER

$_SERVER['HTTP_REFERER']