## 问题场景 在配置Nginx反向代理时,我们经常遇到这样的配置: ```nginx location /hidden-path/ { # 这个路径必须用两个/包裹,不然rewrite正则表达式无法正确匹配 rewrite ^/hidden-path/(.*)$ /actual-service/$1 break; proxy_pass http://127.0.0.1:8088/; } ``` 你是否曾疑惑:为什么`proxy_pass`结尾的`/`如此关键?删掉它为什么就不工作了? ## 核心差异 ### 有结尾`/`的情况 ```nginx proxy_pass http://127.0.0.1:8088/; ``` - 请求:`/hidden-path/api/test` - 重写后:`/actual-service/api/test` - 最终代理到:`http://127.0.0.1:8088/actual-service/api/test` ### 无结尾`/`的情况 ```nginx proxy_pass http://127.0.0.1:8088; ``` - 请求:`/hidden-path/api/test` - 重写后:`/actual-service/api/test` - 最终代理到:`http://127.0.0.1:8088/hidden-path/actual-service/api/test` ## 关键规则 1. **有结尾`/`**:Nginx用rewrite后的路径完全替换location匹配部分 2. **无结尾`/`**:Nginx将location匹配部分与rewrite后路径拼接 ## 实际应用 这种模式常用于安全代理: - 用复杂路径隐藏真实服务(如`/insf823498haerbvbqrf.../`) - 内部重写到真实路径(如`/ollama/`) - 保护后端服务不被直接访问 ## 记住要点 下次配置Nginx代理时,记得检查那个小小的`/`——它承载着路径重写的关键逻辑! **一句话总结:proxy_pass结尾的/决定路径是替换还是拼接。** Loading... ## 问题场景 在配置Nginx反向代理时,我们经常遇到这样的配置: ```nginx location /hidden-path/ { # 这个路径必须用两个/包裹,不然rewrite正则表达式无法正确匹配 rewrite ^/hidden-path/(.*)$ /actual-service/$1 break; proxy_pass http://127.0.0.1:8088/; } ``` 你是否曾疑惑:为什么`proxy_pass`结尾的`/`如此关键?删掉它为什么就不工作了? ## 核心差异 ### 有结尾`/`的情况 ```nginx proxy_pass http://127.0.0.1:8088/; ``` - 请求:`/hidden-path/api/test` - 重写后:`/actual-service/api/test` - 最终代理到:`http://127.0.0.1:8088/actual-service/api/test` ### 无结尾`/`的情况 ```nginx proxy_pass http://127.0.0.1:8088; ``` - 请求:`/hidden-path/api/test` - 重写后:`/actual-service/api/test` - 最终代理到:`http://127.0.0.1:8088/hidden-path/actual-service/api/test` ## 关键规则 1. **有结尾`/`**:Nginx用rewrite后的路径完全替换location匹配部分 2. **无结尾`/`**:Nginx将location匹配部分与rewrite后路径拼接 ## 实际应用 这种模式常用于安全代理: - 用复杂路径隐藏真实服务(如`/insf823498haerbvbqrf.../`) - 内部重写到真实路径(如`/ollama/`) - 保护后端服务不被直接访问 ## 记住要点 下次配置Nginx代理时,记得检查那个小小的`/`——它承载着路径重写的关键逻辑! **一句话总结:proxy_pass结尾的/决定路径是替换还是拼接。** 最后修改:2025 年 11 月 23 日 © 允许规范转载 赞 别打赏,我怕忍不住购买辣条与续命水