如何在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
答案 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-module和add_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;