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

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

假设我想将一个/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_urilocation这似乎是一个显而易见的功能。

答案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
}

相关内容