nginx重写以替换单个字符

时间:2017-04-24 20:56:01

标签: nginx url-rewriting wget

我有一个工具可以下载我在镜像到本地NGINX服务器的过程中的一堆tarball和补丁,以加快下载过程并让我们更严格地控​​制使用的内容。为了使工具正常工作,本地文件名必须与远程文件名匹配(路径无关紧要),但由于该工具认为是文件名,我遇到了?的障碍。

一个例子是下载这个远程补丁:

https://gitweb.gentoo.org/repo/gentoo.git/plain/dev-libs/openssl/files/openssl-1.0.2d-parallel-build.patch?id=c8abcbe8de5d3b6cdd68c162f398c011ff6e2d9d

就工具而言,文件名为openssl-1.0.2d-parallel-build.patch?id=c8abcbe8de5d3b6cdd68c162f398c011ff6e2d9d,中间有一个漂亮的小?,本地镜像必须是:

https://server.local/mirror/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;
}

可以帮助缩小差距。

1 个答案:

答案 0 :(得分:1)

locationrewrite指令使用已经分离出?和查询字符串的规范化URI。

变量$request_uri包含未修改的URI,可以使用if...return语句进行查询:

if ($request_uri ~ ^(/.*)[?](.*)$) { 
    return 301 $1%3f$2;
}

您可能希望将其置于location块内以限制范围。有关使用if

的信息,请参阅this caution