Nginx之前端代理Laravel
2017-09-04 本文已影响1056人
勤劳一沙鸥
前置条件:
1,业务服务器 http://127.0.0.1:8000端口
2,前端服务器 http://127.0.0.1:8080端口
目标要求:
访问 http://127.0.0.1:8080/three,即访问 http://127.0.0.1:8000
配置
开始
location /three/ {
proxy_pass http://127.0.0.1:8000/;
}
- http://127.0.0.1:8000/ 最后的斜杠
/
的作用:
- 带斜杠
/
访问http://127.0.0.1:8080/three/login,相当于访问 http://127.0.0.1:8000/login - 不带斜杠,http://127.0.0.1:8080/three/login,相当于访问 http://127.0.0.1:8000/three/login
- 业务服务器没有 three 信息,所以我们的配置要带
/
问题
这里边第一个问题如下图:

问题描述:我们访问的是8080端口,但这里css文件下载路径,确变成了8000端口,相当于暴露了我们想隐藏的服务器。
调整配置,增加 proxy_set_header Host $host:$server_port;
location /three/ {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $host:$server_port;
}

这回所有链接确实指现8080,但文件不能下载。
拿app.css举例,浏览器访问的是
http://127.0.0.1:8080/css/app.css
,文件不存。 但我们知道正确的路径应该是 http://127.0.0.1:8080/three/css/app.css
这是一个因为绝对路径引起的问题,有点尴尬。Laravel默认的输出,是以http开头的绝对路径

要么我们改掉输出的代码,统一采用相对路径。(方案确实可行,但放到最后,在nginx实在没有办法的时候再用,这属于王炸)
要么在代理层面上把这些绝对路径改成正确喽。
更新配置
location /three/ {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $host:$server_port;
sub_filter '//$host:$server_port' '//$host:$server_port/three';
sub_filter_once off;
}
使用一个 sub_filter
,可以将原有的输出文本内容修改掉,替换为我们知道的正确的地址。 sub_filter
可以配置多条,用以替换很多很多内容,也可以写的很细致。

貌似可以了,那让我们输入用户名和密码测试一下喽,

用户名密码正确,服务器将页面重定向到home页面,但是, 路径中又少一个可爱的three
继续配置nginx,让其可以调整重定向的地址
location /three/ {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $host:$server_port;
sub_filter '//$host:$server_port' '//$host:$server_port/three';
sub_filter_once off;
proxy_redirect http://$host:$server_port http://$host:$server_port/three;
}

总结
搞起来还是挺麻烦的,所有配置修改不要忘了重启nginx,nginx -s reload
,然后就是耐心,细心。
最后的配置保留
location /three/ {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 下边这三句是搭档。
# 第一句,让隐藏的服务器不暴露自己的真实端口。
# 第二名,nginx自动将绝对路径修改,增加代理的关键字,让路径可以找到
# 第三句,让服务器返回302,跳转路径自去增加代理的关键字
proxy_set_header Host $host:$server_port;
sub_filter '//$host:$server_port' '//$host:$server_port/three';
proxy_redirect http://$host:$server_port http://$host:$server_port/three;
sub_filter_once off;
}