Nginx 1.14.2无法读取自定义响应头,正确读取方式是什么?
Nginx读取auth_request返回自定义响应头的解决方法
问题根因
$http_*格式的变量用于读取客户端发送到Nginx的请求头,无法读取上游服务(这里就是你的auth.php)返回的响应头,因此你拿不到crawler字段的值。
解决步骤
- 用
auth_request_set指令捕获auth_request上游返回的自定义响应头,上游响应头对应的变量格式为$upstream_http_<响应头小写名称>,你的响应头名为crawler,对应变量就是$upstream_http_crawler - 替换原if判断里的
$http_crawler为你自定义的捕获变量即可
修改后的配置示例
location /download/ { # 节省带宽 limit_req zone=limit_by_addr burst=5 nodelay; limit_req_status 429; # 匹配除目录外的所有类型文件 location ~ .+(?<!/)$ { # 下载操作强制登录 auth_request /account/auth.php; error_page 401 = @login; # 新增这行,捕获auth.php返回的crawler响应头到$is_crawler变量 auth_request_set $is_crawler $upstream_http_crawler; # 校验是否为谷歌爬虫 # 若auth.php检测到谷歌爬虫会返回自定义头 "header('crawler: 1');" if ($is_crawler != '1') { # 节省带宽 limit_conn conn_limit_per_ip 5; limit_rate_after 1000m; limit_rate 100k; } } }
注意事项
- 如果你的响应头名称包含中划线(比如
X-Crawler),需要把中划线替换为下划线,全小写后拼接在$upstream_http_后面,示例:$upstream_http_x_crawler - 你使用的Nginx 1.14.2版本原生支持
auth_request_set指令,只要你已经开启了http_auth_request_module(当前你能正常使用auth_request说明该模块已开启,无需额外调整)
内容的提问来源于stack exchange,提问作者Mary
相关产品推荐
相关产品推荐

