Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redirect 如何从nginx发出相对url重定向?_Redirect_Nginx - Fatal编程技术网

Redirect 如何从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

如何在nginx中配置重定向以响应特定url,并将其相对重定向到特定路径

建议这是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,例如在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)';
}
这个奇怪的配置是如何工作的

  • 使用
    ngx.exit
    以301状态代码退出,它不会创建“位置”标题(
    return
    指令始终创建“位置”标题,甚至是空标题值)
  • 使用
    add_header
    添加
    位置:/qwerty
    头,它不会插入
    ://

nginx版本1.11.8中提供了一个nginx指令,该指令在默认情况下处于启用状态。如果禁用,nginx发出的重定向将是相对的。这个问题有点老了,但可能对你们所有人都有用

 absolute_redirect off;

“return”指令中有空格,这是一个很好的技巧。nginx的这种行为有没有被记录在案?这个空间把戏很搞笑也很酷,你是怎么发现的?嗨@TrevorFreeman,RFC2616实际上允许“空间把戏”。在“4.2消息标题”章节中,标题值定义为
字段值=*(字段内容| LWS)
*LWS
表示零个或多个
线性空白
@xiaochen RFC 2616已过时3年。RFC 7231现在允许相对重定向添加_头解决方案速度明显较慢这是最简单和完美的解决方案,但我必须在私人浏览器窗口中检查它,以确认位置头是相对的。由于缓存行为,常规浏览器窗口仍显示绝对位置标题。