如何在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>