假设我想将一个/images/目录移动到一个images主机,以便http://example.org/images/foo.png之前的内容变成http://images.example.org/foo.png 。
如果我这样做: location /images/ { return 301 http://images.example.org$request_uri; } location /images/ { return 301 http://images.example.org$request_uri; } ,结果是redirect到http://images.example.org/images/foo.png这不是我想要的。
一个较老的问题有一个答案,build议使用正则expression式的location ,但这似乎是一个矫枉过正。
是否真的没有办法引用$request_uri与location前缀斩掉而不使用正则expression式? 似乎有一个明显的特点。
我不认为我们可以完全消除这个用例的正则expression式。 然而,这是一个替代的解决scheme,不使用正则expression式的location ,但在 location块内使用正则expression式…
location /images/ { rewrite "^/images/?(.*)$" "/$1"; return 301 http://images.example.org$uri; }
请知道$uri不包含$args 。 但是, $request_uri 。 在这个替代解决scheme中,我们使用正则expression式修改$uri ,然后处理。 $request_uri不能被修改。
要添加到Pothis的答案 ,你可以简单地添加permanent标志rewrite和直接redirect,而不使用return :
location /images/ { rewrite ^/images/(.*)$ $scheme://images.example.org/$1 permanent; }
这也将保持与redirect的参数。
或者,如果需要对uri进行更多修改,则可以简单地在$uri后面追加$is_args和$args :
location /images/ { rewrite ^/images/(.*)$ /$1; [ ... more rewriting ... ] return 301 $scheme://images.example.org$uri$is_args$args }