$ request_uri后缀的variables与位置块前缀不匹配

假设我想将一个/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_urilocation前缀斩掉而不使用正则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 }