如何去除NGINX中$http_referer变量的末尾斜杠以实现动态本地CDN代理
如何移除NGINX $http_referer变量的末尾斜杠并用于proxy_pass
嘿,我明白你的需求——想用Referer头做动态本地CDN,但偏偏$http_referer末尾带的斜杠搞事情对吧?别担心,用NGINX的map指令就能轻松解决这个问题,它可以帮你预先处理变量,去掉末尾的斜杠。
步骤1:在http块中定义变量映射
首先,在你的NGINX配置的http块里添加一个map规则,专门用来清理$http_referer的末尾斜杠:
http { # 这里放你已有的全局配置(比如include mime.types;之类的) map $http_referer $clean_referer { # 匹配所有以斜杠结尾的URL,捕获斜杠前的内容并替换 ~^(.*)/$ $1; # 非末尾斜杠的情况,直接保留原变量 default $http_referer; } # 接下来是你的server块配置... }
这个正则规则~^(.*)/$会精准匹配末尾带斜杠的字符串,(.*)捕获组会提取斜杠前面的所有内容,然后用$1替换掉原变量,相当于直接砍掉了末尾的斜杠。如果原referer本来就没有末尾斜杠,就会走default规则,保持原变量不变。
步骤2:在location中使用清理后的变量
接下来,把你原来location里的$http_referer换成我们新定义的$clean_referer就行:
location / { add_header 'Access-Control-Allow-Origin' '*'; add_header Referrer-Policy 'strict-origin'; proxy_pass $clean_referer; }
可选:增加安全判断(推荐)
为了避免空referer或者无效URL导致的问题,你可以在location里加个简单的判断,确保只有有效的referer才会触发代理:
location / { add_header 'Access-Control-Allow-Origin' '*'; add_header Referrer-Policy 'strict-origin'; if ($clean_referer) { proxy_pass $clean_referer; } # 如果没有有效referer,返回403禁止访问(或者你想要的其他响应) return 403; }
这样就完美解决了末尾斜杠的问题,你的动态CDN代理就能正常工作啦!
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

