假设我想将一个/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 }