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

dan*_*ore 15 redirect nginx

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

nginx的文件表明,这是nginx的默认模式,但在现实中,如果位置被重定向到开始于/ nginx的与在位置字段中的绝对URL响应.

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

location = /a {
  return 301 some/path;
}
location = /b {
  return 301 /qwerty;
}
Run Code Online (Sandbox Code Playgroud)

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

Location: some/path
Run Code Online (Sandbox Code Playgroud)

对于/ b它是:

Location: http://127.0.0.1/qwerty
Run Code Online (Sandbox Code Playgroud)

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

Location: /qwerty
Run Code Online (Sandbox Code Playgroud)

我们想要使用相对重定向的原因是我们想要从不同的域和代理访问nginx,例如在dev中清除或通过ssl终止负载均衡器,并且宁愿通过减轻需要理解的nginx来保持简单那个背景.

仅供参考这些示例针对nginx版本1.4.6和1.9.6进行测试,使用curl,例如:

curl --head http://127.0.0.1/b
Run Code Online (Sandbox Code Playgroud)

小智 15

absolute_redirectnginx 版本1.11.8提供了一个 nginx 指令,默认情况下已启用。如果disabled,则由 nginx 发出的重定向将是相对的。这个问题有点旧,但可能对你们所有人从谷歌点击它有用。

 absolute_redirect off;
Run Code Online (Sandbox Code Playgroud)


xia*_*hen 13

<scheme>://<host>如果returnuri以...开头,则始终插入nginx头过滤器/.
(见ngx_http_script_return_code()ngx_http_header_filter()在参考nginx的源函数)


因此,如果客户端(例如谷歌浏览器)可以接受Location: /qwerty,您可以使用以下配置:

location = /b {
    return 301 " /qwerty";    # insert space char before "/qwerty"
}
Run Code Online (Sandbox Code Playgroud)

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

location = /b {
    add_header Location "/qwerty";
    content_by_lua 'ngx.exit(301)';
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 在“return”指令中使用空格的好技巧。nginx 的这种行为是否记录在任何地方? (2认同)
  • 那个太空把戏又好笑又厉害,你是怎么发现的? (2认同)