如何从nginx发出相对URLredirect?

如何在nginx中configurationredirect来响应某个url,并将相对redirect到特定的path?

nginx文档build议这是nginx的默认模式,但是实际上如果redirect到以/ nginx开头的位置正在响应Location字段中的绝对url。

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

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 

我们想要使用相对redirect的原因是,我们想访问来自不同域和代理的nginx,例如在dev中清除或通过ssl-terminating负载均衡器,宁愿让事情简单,通过减轻nginx需要了解这个背景。

仅供参考这些例子在nginx版本1.4.6和1.9.6上进行了testing,使用curl例如:

 curl --head http://127.0.0.1/b 

如果return uri以/开始,nginx头过滤器总是插入<scheme>://<host>
(参见nginx源代码中的ngx_http_script_return_code()ngx_http_header_filter()函数)


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

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

另一种解决方案可以通过lua-nginx-module和add_header指令完全生成Location: /qwerty

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

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

  • 使用ngx.exit以301的状态码退出,它不会创建“Location”头( return指令总是创建“Location”头,甚至是空的头值)
  • 使用add_header添加Location: /qwerty头,它不会插入<scheme>://<host>