Redirect 如何从nginx发出相对url重定向?
如何在nginx中配置重定向以响应特定url,并将其相对重定向到特定路径 建议这是nginx的默认模式,但实际上,如果重定向到的位置以/nginx开头,则在位置字段中以绝对url响应 对于包含以下位置的本地服务器配置:Redirect 如何从nginx发出相对url重定向?,redirect,nginx,Redirect,Nginx,如何在nginx中配置重定向以响应特定url,并将其相对重定向到特定路径 建议这是nginx的默认模式,但实际上,如果重定向到的位置以/nginx开头,则在位置字段中以绝对url响应 对于包含以下位置的本地服务器配置: location = /a { return 301 some/path; } location = /b { return 301 /qwerty; } 对/a请求的响应位置为: Location: some/path 对于/b,它是: Location: http
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,例如在dev中使用clear或通过ssl终止负载平衡器,并且希望通过解除nginx理解上下文的需要来简化事情
仅供参考,这些示例是针对nginx版本1.4.6和1.9.6进行测试的,使用curl,例如:
curl --head http://127.0.0.1/b
如果
返回
uri以/
开头,nginx头过滤器总是插入://
(请参阅nginx源代码中的
ngx\u http\u script\u return\u code()
和ngx\u http\u header\u filter()
函数以供参考)
因此,如果客户端(例如google chrome)可以接受
位置:/qwerty
,则可以使用以下配置:
location = /b {
return 301 " /qwerty"; # insert space char before "/qwerty"
}
另一种解决方案可以通过和指令准确地生成
位置:/qwerty
:
location = /b {
add_header Location "/qwerty";
content_by_lua 'ngx.exit(301)';
}
这个奇怪的配置是如何工作的
- 使用
以301状态代码退出,它不会创建“位置”标题(ngx.exit
指令始终创建“位置”标题,甚至是空标题值)return
- 使用
添加add_header
头,它不会插入位置:/qwerty
://
absolute_redirect off;
“return”指令中有空格,这是一个很好的技巧。nginx的这种行为有没有被记录在案?这个空间把戏很搞笑也很酷,你是怎么发现的?嗨@TrevorFreeman,RFC2616实际上允许“空间把戏”。在“4.2消息标题”章节中,标题值定义为
字段值=*(字段内容| LWS)
*LWS
表示零个或多个线性空白
@xiaochen RFC 2616已过时3年。RFC 7231现在允许相对重定向添加_头解决方案速度明显较慢这是最简单和完美的解决方案,但我必须在私人浏览器窗口中检查它,以确认位置头是相对的。由于缓存行为,常规浏览器窗口仍显示绝对位置标题。