共计 1895 个字符,预计需要花费 5 分钟才能阅读完成。
前言
由于 nginx 带不带/
老是会混乱,并且确实在使用中出现过问题,比如使用不当导致代理后的 url 带有//
,或者说配置很久也不能达到自己想要代理的效果。于是想着还是好好研究一下,并在以后规范自己 nginx 的使用。
如果代理后的地址带有
//
,spring security 中可能报错:The request was rejected because the URL contained a potentially malicious String "//"
测试
准备工作
为了测试以下内容,专门做了一个镜像,不然看不见 nginx 代理后的完整请求,如果有需要的话可以搭建一下。
docker run -d --name full-path -p 5000:5000 hausen1012/full-path
然后可以根据 快速搭建 nginx 的脚本 这篇文章进行搭建 nginx。
1. location
不带,proxy_pass
带:
location /api {
proxy_pass http://127.0.0.1:5000/;
}
-
当请为
/api/
时,Nginx 会 308 重定向到/api
。 -
当请求匹配到
/api
时,Nginx会将请求转发给http://127.0.0.1:5000/
。 -
如果请求是
/api/path1/path2
,则会转发到http://127.0.0.1:5000//path1/path2
。
需要注意的是,这里如果后面不带 /
,可能会导致双斜杠问题。(一般来说不会出问题,除非不允许使用双斜杠)
2. location
带,proxy_pass
带:
location /api/ {
proxy_pass http://127.0.0.1:5000/;
}
-
当请求匹配到
/api
时,Nginx 会 301 重定向到/api/
。 -
当请求匹配到
/api
时,Nginx会将请求转发给http://127.0.0.1:5000/
。 -
如果请求是
/api/path1/path2
,则会转发到http://127.0.0.1:5000/path1/path2
。
由上面两点得知,当proxy_pass
带斜杠时,location
部分是要被切割的部分,切割的内容具体取决于location
的内容是否带斜杠,所以这就有可能导致双斜杠的问题。
3. location
不带,proxy_pass
不带:
location /api {
proxy_pass http://127.0.0.1:5000;
}
-
当请求匹配到
/api
时,Nginx会将请求转发给http://127.0.0.1:5000/api
。 -
如果请求是
/api/path1/path2
,则会转发到http://127.0.0.1:5000/api/path1/path2
。
4. location
带,proxy_pass
不带:
location /api/ {
proxy_pass http://127.0.0.1:5000;
}
-
当请求匹配到
/api
时,Nginx 会 301 重定向到/api/
。 -
当请求匹配到
/api/
时,Nginx会将请求转发给http://127.0.0.1:5000/api/
。 -
如果请求是
/api/path1/path2
,则会转发到http://127.0.0.1:5000/api/path1/path2
。
结论
先说结论,proxy_pass
路径带不带斜杠影响是否进行拼接location
匹配的路径,如果带斜杠则不拼接,不带则拼接。而location
带不带斜杠影响不是很大,带斜杠一定没问题,不带斜杠可能导致双斜杠问题。
那么这样的话可以规范一下配置文件的配置方式。
1. 所有的请求都转发到一个后端
location / {
proxy_pass http://127.0.0.1:5000/;
}
这个是怎么配置都不会出问题的。
2. 需要截掉location部分
location /gateway/ {
proxy_pass http://127.0.0.1:5000/;
}
都以斜杠结尾,不会有双斜杠问题。如果location是截取部分,那么可以这样操作。
location /gateway/api/ {
proxy_pass http://127.0.0.1:5000/api/;
}
3. 代理后地址需要包含location部分
location /nacos/ {
proxy_pass http://127.0.0.1:5000/nacos/;
}
比如 nacos 这种本来就有基础路径,那么还是在 proxy_pass 后面加上路径并带上斜杠即可。如果是多级路径,那么可以这样操作。
location /nacos/v1/ {
proxy_pass http://127.0.0.1:5000/nacos/v1/;
}
提醒:本文发布于295天前,文中所关联的信息可能已发生改变,请知悉!