使用反向代理 nginx 进行重定向

使用反向代理 nginx 进行重定向

我有一个反向代理 nginx,它监听端口 8888。前端监听 8000。问题如下:浏览器被重定向到http://frontend:8000/user/username。在这个阶段,nginx 应该编辑回复的LocationHTTP 标头以重定向到相同的 URL,但以 结尾/

不幸的是,一个简单的重写重定向指令将端口更改为 nginx 端口,所以我最终加载了http://frontend:8888/user/username/。添加port_in_redirect off并不能解决问题,因为端口被剥离了,我最终http://frontend/user/username

目前我有(nginx 服务器位于 localhost docker 容器上)

location = /user/username {
    proxy_redirect http://127.0.0.1:8888/user/username /user/username/;
}

但是这个给了我一个 404,因为显然它根本没有进行重定向,它试图为我提供一个文件

2016/05/12 12:12:16 [error] 186#0: *1 open()     "/usr/share/nginx/html/user/username" failed (2: No such file or directory), client: 10.0.42.1, server: , request: "GET /user/username HTTP/1.1", host: "172.17.5.168:8000"

答案1

我做出这个答复是假设我已经充分理解了这个不太清楚的问题...

您希望发出如下请求:

 1. Request (frontend:8000/user/username): client -> reverse-proxy (8888) -> frontend (8000)
 2. Response (redirect to frontend:8000/user/username/) : client <- reverse-proxy (8888) <- frontend (8000)
 3. Request (frontend:8000/user/username/): client -> frontend (8000)
  1. 您没有proxy_pass在所分享的配置片段中指定指令。这里假设该指令存在,否则您的问题就变得毫无意义了。
  2. 您指定不希望重定向到反向代理,而是直接重定向到前端。但是,您的proxy_redirect配置恰恰相反。我建议你(再)读一下它的文档。
  3. 您最后分享的日志片段似乎来自前端组件,而不是反向代理组件(host: "172.17.5.168:8000)。但是,如果是这样(由于docker容器+误导性的端口绑定),它将导致指令的缺失proxy_pass,参见项目符号#1。

相关内容