Nginx location 和 proxy_pass路径配置问题小结

本站所有内容来自互联网收集,仅供学习和交流,请勿用于商业用途。如有侵权、不妥之处,请第一时间联系我们删除!Q群:迪思分享

免费资源网 – https://freexyz.cn/
目录一、Nginx location 基本配置1.1、Nginx 配置文件1.2 、Python 脚本二、测试2.1、测试 location2.2、测试 location2.3、测试三 location2.4、location 不加2.5、location 末尾2.6、 location 末尾三、总结

本文是基于 location 的匹配末尾是否配置 / 和 proxy_pass 末尾是否配置 / ,进行测试,完全还原了整个测试过程。帮助了解具体的情况。

一、Nginx location 基本配置

1.1、Nginx 配置文件

upstream test1{ server 127.0.0.1:8000; } upstream test2{ server 127.0.0.1:8000; } server{ server_name test.com; listen 80; access_log /usr/local/openresty/nginx/logs/test.com_access.log latest; error_log /usr/local/openresty/nginx/logs/test.com.log error; 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_connect_timeout 3s; proxy_read_timeout 120s; proxy_send_timeout 120s; proxy_next_upstream error timeout invalid_header http_404 http_502 http_504 http_500; location /user/ { proxy_set_header Connection “”; proxy_http_version 1.1; proxy_pass http://test1/; } location / { proxy_set_header Connection “”; proxy_http_version 1.1; proxy_pass http://test2/; } }

1.2 、Python 脚本

python2 可以运行

该脚本用于获取请求内容。 这个作为后端,也就是 proxy_pass 代理的后端。

#!/usr/bin/env python import SimpleHTTPServer import SocketServer PORT = 8000 class GetHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): def do_GET(self): print(self.headers) self.send_response(200, “”) def do_POST(self): print(self.headers) content_length = self.headers.getheaders(content-length) length = int(content_length[0]) if content_length else 0 print(self.rfile.read(length)) self.send_response(200, “”) Handler = GetHandler httpd = SocketServer.TCPServer((“”, PORT), Handler) httpd.serve_forever()

二、测试

2.1、测试 location

末尾存在 / 和 proxy_pass末尾存在 /

nginx配置如下

location /user/ { proxy_set_header Connection “”; proxy_http_version 1.1; proxy_pass http://test1/; }

请求url

test.com/user/test.html

后端内容

打印的内容:

Host: test1 Content-Length: 0 User-Agent: PostmanRuntime/7.26.8 Accept: */* Postman-Token: f2bfe770-4f44-4ee9-91c4-060f59dfb26c Accept-Encoding: gzip, deflate, br 127.0.0.1 – – [10/Apr/2021 16:54:26] “POST /test.html HTTP/1.1” 200 –

小结论:proxy_pass 地址加了 / 的话, 请求 test.com/user/test.html 实际请求是 http://test1/test.html。

2.2、测试 location

末尾存在 / 和 proxy_pass末尾不存在 /

nginx配置如下

location /user/ { proxy_set_header Connection “”; proxy_http_version 1.1; proxy_pass http://test1; }

请求url

test.com/user/test.html

后端内容

打印的内容:

Host: test1

Content-Length: 0

User-Agent: PostmanRuntime/7.26.8

Accept: */*

Postman-Token: e33d0a2c-1965-4152-b87c-94fca50f2899

Accept-Encoding: gzip, deflate, br

127.0.0.1 – – [10/Apr/2021 16:57:18] “POST /user/test.html HTTP/1.1” 200 –

小结论: proxy_pass 地址不加了 / 的话, 请求 test.com/user/test.html 实际请求是 http://test1/user/test.html

2.3、测试三 location

不加末尾 / 且 proxy_pass 不加 末尾 /

nginx配置如下

location /user { proxy_set_header Connection “”; proxy_http_version 1.1; proxy_pass http://test1; }

请求url

test.com/user/test.html

后端内容

打印的内容:

Host: test1

Content-Length: 0

User-Agent: PostmanRuntime/7.26.8

Accept: */*

Postman-Token: 31cd33c6-4c95-41b5-a095-28cdc7113dcd

Accept-Encoding: gzip, deflate, br

127.0.0.1 – – [10/Apr/2021 16:59:34] “POST /user/test.html HTTP/1.1” 200 –

请求 test.com/user/test.html 实际请求是 http://test1/user/test.html

2.4、location 不加

末尾 / 且 proxy_pass 加 末尾 /

nginx配置如下

location /user { proxy_set_header Connection “”; proxy_http_version 1.1; proxy_pass http://test1/; }

请求url

test.com/user/test.html

后端内容

打印的内容:

Host: test1

Content-Length: 0

User-Agent: PostmanRuntime/7.26.8

Accept: */*

Postman-Token: d0f4b83f-6482-41ba-8a01-c059eececc2d

Accept-Encoding: gzip, deflate, br

127.0.0.1 – – [10/Apr/2021 17:00:21] “POST //test.html HTTP/1.1” 200 –

请求 test.com/user/test.html 实际请求是 http://test1//test.html

2.5、location 末尾

有 / proxy_pass 末尾其他有路径,且末尾加 /

nginx配置如下

location /user/ { proxy_set_header Connection “”; proxy_http_version 1.1; proxy_pass http://test1/haha/; }

请求url

test.com/user/test.html

后端内容

打印的内容:

Host: test1

Content-Length: 0

User-Agent: PostmanRuntime/7.26.8

Accept: */*

Postman-Token: 6447cf0b-5988-4f96-81a4-2b621fe32604

Accept-Encoding: gzip, deflate, br

127.0.0.1 – – [10/Apr/2021 17:03:27] “POST /haha/test.html HTTP/1.1” 200 –

请求 test.com/user/test.html 实际请求是 http://test1/haha/test.html

2.6、 location 末尾

有 / proxy_pass 末尾其他有路径,且末尾不加 /

nginx配置如下

location /user/ { proxy_set_header Connection “”; proxy_http_version 1.1; proxy_pass http://test1/haha; }

请求url

test.com/user/test.html

后端内容

打印的内容:

Host: test1

Content-Length: 0

User-Agent: PostmanRuntime/7.26.8

Accept: */*

Postman-Token: 32fb2a50-1e7c-4131-9804-1828e21ca841

Accept-Encoding: gzip, deflate, br

127.0.0.1 – – [10/Apr/2021 17:05:03] “POST /hahatest.html HTTP/1.1” 200 –

请求 test.com/user/test.html 实际请求是 http://test1/hahatest.html

三、总结

序号 访问URL location配置 proxy_pass配置 后端接收的请求 备注 1 test.com/user/test.html /user/ http://test1/ /test.html 2 test.com/user/test.html /user/ http://test1 /user/test.html 3 test.com/user/test.html /user http://test1 /user/test.html 4 test.com/user/test.html /user http://test1/ //test.html 5 test.com/user/test.html /user/ http://test1/haha/ /haha/test.html 6 test.com/user/test.html /user/ http://test1/haha /hahatest.html

注意上表格中的后端是指 python 脚本对应的web服务。

在日常的web网站部署中,经常会用到 nginx的 proxy_pass 反向代理,有一个配置需要弄清楚:配置 proxy_pass 时,

当在后面的 upstram_name 后面出现了 /,相当于是绝对根路径,则 nginx 不会把 location 中匹配的路径部分代理走; 如果没有 /,则会把匹配的路径部分也给代理走。
免费资源网 – https://freexyz.cn/


© 版权声明
THE END
★喜欢这篇文章吗?喜欢的话,麻烦动动手指支持一下!★
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容