假设我想将一个/images/
目录移动到images
主机,以便之前的内容http://example.org/images/foo.png
变成http://images.example.org/foo.png
。
如果我这样做:location /images/ { return 301 http://images.example.org$request_uri; }
,结果就是重定向到,http://images.example.org/images/foo.png
但这不是我想要的。
一个较老的问题有一个建议使用正则表达式的答案location
,但这似乎有点小题大做。
不使用正则表达式,真的就没有办法引用去掉前缀的吗$request_uri
?location
这似乎是一个显而易见的功能。
答案1
我认为我们不能完全消除此用例中的正则表达式。但是,这里有一个不使用正则表达式location
,而是使用正则表达式的替代解决方案里面 location
堵塞...
location /images/ {
rewrite "^/images/?(.*)$" "/$1";
return 301 http://images.example.org$uri;
}
请注意$uri
不包含$args
。但是$request_uri
包含 。在此替代解决方案中,我们$uri
在处理 之前使用正则表达式修改 。$request_uri
但是 不能被修改。
答案2
添加到Pothis 的回答,您可以简单地添加permanent
标志rewrite
并直接重定向而不使用return
:
location /images/ {
rewrite ^/images/(.*)$ $scheme://images.example.org/$1 permanent;
}
这也将保留重定向的参数。
或者,如果需要对 uri 进行更多修改,您只需在后面附加$is_args
和即可:$args
$uri
location /images/ {
rewrite ^/images/(.*)$ /$1;
[ ... more rewriting ... ]
return 301 $scheme://images.example.org$uri$is_args$args
}