2017-04-24 348 views
1

我有一個工具,下載一堆tarball和補丁,我正在鏡像到一個本地NGINX服務器的過程中,以加快下載過程,並給我們更嚴格的控制什麼是使用。爲了使工具正常工作,本地文件名必須與遠程文件名匹配(路徑無關緊要),但由於該工具考慮了文件名,我遇到了一個?的問題。nginx重寫替換單個字符

一個例子是下載此遠程補丁:

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

locationrewrite指令使用規範化的URI,它已經分離出?和查詢字符串。

變量$request_uri包含未修改的URI,可以使用if...return語句來詢問:

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

您可能希望將這個location塊內限制範圍。請參閱this caution關於使用if

+0

管理錯過重寫使用規範化的URI,謝謝。 – phill