如何从nginx发出相对URL重定向?

时间:2015-11-04 14:01:57

标签: redirect nginx

如何在nginx中配置重定向以响应具有相对重定向到特定路径的某个URL?

nginx documentation表明这是nginx的默认模式,但实际上,如果重定向到以/ nginx开头的位置正在使用位置字段中的绝对URL进行响应。

对于包含位置的本地服务器配置:

location = /a {
  return 301 some/path;
}
location = /b {
  return 301 /qwerty;
}

对/ a的请求的响应位置是:

Location: some/path

和/ b它是:

Location: http://127.0.0.1/qwerty

但是,我们希望/ b回复:

Location: /qwerty

我们想要使用相对重定向的原因是我们希望从不同的域和代理访问nginx,例如在开发中或通过ssl终止负载均衡器,并且宁愿通过减轻需要理解该上下文的nginx来保持简单。

仅供参考这些例子使用curl测试nginx版本1.4.6和1.9.6,例如:

curl --head http://127.0.0.1/b

2 个答案:

答案 0 :(得分:12)

如果<scheme>://<host> uri以return开头,则

nginx标头过滤器始终会插入/
(请参阅nginx源中的ngx_http_script_return_code()ngx_http_header_filter()函数以供参考)

因此,如果客户端(例如Google Chrome)可以接受Location: /qwerty,则可以使用以下配置:

location = /b {
    return 301 " /qwerty";    # insert space char before "/qwerty"
}

另一种解决方案可以通过lua-nginx-moduleadd_header指令准确生成Location: /qwerty

location = /b {
    add_header Location "/qwerty";
    content_by_lua 'ngx.exit(301)';
}

这个奇怪的配置如何工作?

  • 使用ngx.exit退出状态代码为301,它不会创建&#34;位置&#34; header(return指令始终创建&#34;位置&#34;标头,甚至是空标头值)
  • 使用add_header添加Location: /qwerty标头,但不插入<scheme>://<host>

答案 1 :(得分:3)

nginx版本 1.11.8 中提供了一个nginx指令absolute_redirect,该指令默认启用。如果禁用,则nginx发出的重定向将是相对的。这个问题有点老了,但对您从Google搜寻它的所有人来说可能有用。

 absolute_redirect off;