如何在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-module和add_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>| 归档时间: |
|
| 查看次数: |
5568 次 |
| 最近记录: |