Nginx 代理能在内部完成重定向并返回真实内容吗?

ditf
  • 6

问题描述

有一个请求,这个请求必定会返回一个301的请求。一般来说,就是浏览器去访问这个重定向后的链接,但是现在的情况是这个返回后的请求是内部链接,不能直接访问,并且这个301返回的location不是固定的。
现在我希望,通过nginx代理这个请求后,最终返回的是重定向之后的内容,浏览地地址不变。

问题出现的环境背景及自己尝试过哪些方法

  1. 试过 proxy_redirect命令来修改301的location,但是因为获取不到最终的地址,所以也没用。
  2. 试过 rewrite,但是问题同上。
  3. 准备尝试通过lua来获取301的location,再直接代理这个地址。还在尝试阶段。。。

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

其他

其实就是想代理seaweedfs的文件,我希望能通过fid直接请求主节点,但是它会直接返回volume的地址,这个地址是隐藏的;这个又不是seaweedfs的问题,所以也没在issue下问。。。

你期待的结果是什么?实际看到的错误信息又是什么?

我希望nginx内部就能解决。。。

谢谢大家

20190603更新

根据@Bug开发的回答,加上 return 301

 location /img2/ {
    return 301 $host$request_uri;
 }

返回:
图片描述
但是返回的还是本身,因为返回的location没有http://,地址栏的url一直添加,最终导致414 Request-URI Too Large

回复
阅读 3.4k
3 个回答
✓ 已被采纳

说说最后采取的方法,利用lua脚本请求一次当前url,然后获取location,再代理。
采用的是openresty

nginx的conf文件:

location /download/ {
    set $cur_url ""; #将在lua中赋值
    set $weed_url "http://xxxx:9333/";
    rewrite_by_lua_file /usr/local/openresty/work/http.lua;
    proxy_pass $cur_url;
}

本来想用set_by_lua方法的,但是不支持i/o所以用的rewrite模块,这里有解释 https://github.com/openresty/...

lua文件

local http = require"resty.http"
local url = ngx.var.request_uri;
local hc = http:new()
local ok, code, headers, body = hc:request{
    url = ngx.var.weed_url .. url:sub(url:match(".*/()"), url:len()),
    timeout = 3000,
}
ngx.var.cur_url = headers.location;

差不多就这样,但是感觉有点麻烦,应该有更简单的方法。。。
最后谢谢 @Bug开发 的帮助

 return 301 http://$host$uri;
 这样也不行吗?
杨大帅
  • 1
新手上路,请多包涵

大哥,能贴出完整的代码么,我遇到同样的问题,有错误

clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏