我有一个反向代理 nginx,它监听端口 8888。前端监听 8000。问题如下:浏览器被重定向到http://frontend:8000/user/username
。在这个阶段,nginx 应该编辑回复的Location
HTTP 标头以重定向到相同的 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)
- 您没有
proxy_pass
在所分享的配置片段中指定指令。这里假设该指令存在,否则您的问题就变得毫无意义了。 - 您指定不希望重定向到反向代理,而是直接重定向到前端。但是,您的
proxy_redirect
配置恰恰相反。我建议你(再)读一下它的文档。 - 您最后分享的日志片段似乎来自前端组件,而不是反向代理组件(
host: "172.17.5.168:8000
)。但是,如果是这样(由于docker容器+误导性的端口绑定),它将导致指令的缺失proxy_pass
,参见项目符号#1。