nginx upstream反向代理 加不加斜杠?
nginx使用proxy_pass
分发,稍不注意会掉坑:
测试配置:
upstream tomcats {
server 10.96.119.199:8080 weight=1;
}
server {
server_name test.com;
access_log api.log;
location /api1 {
proxy_pass http://tomcats;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /api2 {
proxy_pass http://tomcats/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /api3/ {
proxy_pass http://tomcats;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /api4/ {
proxy_pass http://tomcats/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
日志情况
127.0.0.1 - - [01/Jun/2020:16:20:31 +0800] "GET /api1/pwd?len=15 HTTP/1.1" 404 140 "-" "curl/7.29.0"
127.0.0.1 - - [01/Jun/2020:16:21:10 +0800] "GET /api2/pwd?len=15 HTTP/1.1" 200 53 "-" "curl/7.29.0"
127.0.0.1 - - [01/Jun/2020:16:21:14 +0800] "GET /api3/pwd?len=15 HTTP/1.1" 404 140 "-" "curl/7.29.0"
127.0.0.1 - - [01/Jun/2020:16:21:21 +0800] "GET /api4/pwd?len=15 HTTP/1.1" 200 53 "-" "curl/7.29.0"
比对
location | url | 结果 |
---|---|---|
/ | http://10.96.119.199:8080/pwd?len=15 | {"password":"UpXyC2bR9W_qwRV","length":15} |
api1 | http://test.com/api1/pwd?len=15 | {"timestamp":"2020-06-01T07:36:13.492+0000","status":404,"error":"Not Found","message":"No message available","path":"/api1/pwd"} |
api2 | http://test.com/api2/pwd?len=15 | {"password":"UpXyC2bR9W_qwRV","length":15} |
api3 | http://test.com/api3/pwd?len=15 | {"timestamp":"2020-06-01T07:37:34.938+0000","status":404,"error":"Not Found","message":"No message available","path":"/api3/pwd"} |
api4 | http://test.com/api4/pwd?len=15 | {"password":"UpXyC2bR9W_qwRV","length":15} |
结论
- 当location
与proxy_pass
同时带或者同时不带斜杠时,uri部分不修改,直接传到proxy_pass
的后端
- 当location
与proxy_pass
一个带一个不带斜杠时候,匹配的uri部分将会被修改为该参数中的uri,造成后端无法识别。