综述
nginx官方网站讲解proxy_pass时,只给了规则的说明,并没有给出具体的示例辅助理解。对于英语不太好的人,理解起来真的很头痛,只能通过测试来验证对英文意思的猜测。 nginx对proxy_pass的官方说明见http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass 其将proxy_pass的转发规则分为3类:
- location为简单配置(非正则表达式),proxy_pass的url带path路径
- location为简单配置(非正则表达式),proxy_pass的url不带path路径
- nginx无法确认url的替换规则
url中带path路径
判断条件
如果域名后面带了“/”,则认为是url中带了path路径。比如:
- proxy_pass http://127.0.0.1/
- proxy_pass http://127.0.0.1/aaa
- proxy_pass http://127.0.0.1/aaa/
转发规则
nginx官网原文如下:
If the proxy_pass directive is specified with a URI, then when a request is passed to the server, the part of a normalized request URI matching the location is replaced by a URI specified in the directive:
location /name/ { proxy_pass http://127.0.0.1/remote/; }
个人理解如下: 使用proxy_pass配置的url去替换location指定的部分。如下图就是使用http://127.0.0.1/remote/去替换path中/name/这一段
url中不带path路径
判断条件
与第一点相反,proxy_pass指定url中只有域名,比如ttp://127.0.0.1
转发规则
If proxy_pass is specified without a URI, the request URI is passed to the server in the same form as sent by a client when the original request is processed, or the full normalized request URI is passed when processing the changed URI:
location /some/path/ { proxy_pass http://127.0.0.1; }
个人理解如下: 转发url=proxy_pass配置的url+原始url中path部分
nginx无法确认url的替换规则
这种场景nginx又细分成3类
location指定的是正则表达式
nginx官方要求配置proxy_pass时,不能带path路径。
When location is specified using a regular expression, and also inside named locations. In these cases, proxy_pass should be specified without a URI.
path路径在location中使用rewrite重写了
比如
location /name/ { rewrite /name/([^/]+) /users?name=$1 break; proxy_pass http://127.0.0.1/test; } In this case, the URI specified in the directive is ignored and the full changed request URI is passed to the server.
这种场景,nginx会忽略proxy_pass中配置的path路径,然后使用proxy_pass中指定的域名加上rewrite中指定的path路径即为转发后的url。
proxy_pass配置的url中带变量
比如
location /name/ { proxy_pass http://127.0.0.1$request_uri; } In this case, if URI is specified in the directive, it is passed to the server as is, replacing the original request URI.
这种场景,如果proxy_pass配置的url经过变量转换后带path路径,则直接使用该url。
其他
实际上,“nginx无法确认url的替换规则”3个细分类可能存在交叉的地方,这个nginx没有提到,大家只能动手自己去测试nginx的混合场景的规则了。 比如我们系统后端服务是没有context-path的,后面为了容器化需要添加context-path,详细背景见之前的博客。为了对前端屏蔽变化,因此需要修改nginx的转发规则。如下图所示,这样就涉及到“location指定的是正则表达式”和“proxy_pass配置的url中带变量”混合场景了。
If the location is given by regular expression, can not be a URI part in proxy_pass directive, unless there are variables in the directive
如果location使用正则表达式,proxy_pass中不能指定path,除非proxy_pass中包含变量。
|