由于 nginx 带不带/
老是会混乱,并且确实在使用中出现过问题,比如使用不当导致代理后的 url 带有//
,或者说配置很久也不能达到自己想要代理的效果。于是想着还是好好研究一下,并在以后规范自己 nginx 的使用。
如果代理后的地址带有
//
,spring security 中可能报错:The request was rejected because the URL contained a potentially malicious String "//"
测试
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/;
}