我有一个工具可以下载我在镜像到本地NGINX服务器的过程中的一堆tarball和补丁,以加快下载过程并让我们更严格地控制使用的内容。为了使工具正常工作,本地文件名必须与远程文件名匹配(路径无关紧要),但由于该工具认为是文件名,我遇到了?
的障碍。
一个例子是下载这个远程补丁:
就工具而言,文件名为openssl-1.0.2d-parallel-build.patch?id=c8abcbe8de5d3b6cdd68c162f398c011ff6e2d9d
,中间有一个漂亮的小?
,本地镜像必须是:
该工具使用wget下载文件但不替换'?'与'%3f'所以NGINX服务器返回404.如果你手动更换'?'与'%3f'然后wget正常工作。
我很好,NGINX服务器永远不会将?
视为查询字符串,但如果不可能,我需要一种方法来重写uri,以便正确下载文件。我以为它会是这样的:
rewrite ^(.*)\?(.*)$ $1%3f$2 permanent;
但这并不能解决我的问题。镜像文件夹在/etc/nginx/apps/mirror.conf
中定义为别名,如果重要:
location /mirror {
autoindex on;
alias /var/lib/dl-cache;
}
可以帮助缩小差距。
答案 0 :(得分:1)
location
和rewrite
指令使用已经分离出?
和查询字符串的规范化URI。
变量$request_uri
包含未修改的URI,可以使用if...return
语句进行查询:
if ($request_uri ~ ^(/.*)[?](.*)$) {
return 301 $1%3f$2;
}
您可能希望将其置于location
块内以限制范围。有关使用if