Nginx / 系统运维

Nginx配置反向代理时关于带与不带斜杆的区别

浅时光博客 · 3月4日 · 2023年 3.8w 次已读

反向代理配置:location 后面的规则带斜杆和不带斜杆的区别


在 Nginx 的反向代理配置中,location后面的规则带斜杆和不带斜杆是有区别的。如果 location 后面的规则不带斜杆,如 location /api,那么只有完全匹配 /api 的请求才会被转发到指定的代理服务器。如果location后面的规则带斜杆,如 location /api/,那么以 /api 开头的所有请求都会被转发到指定的代理服务器。

  • 举个例子,如果 location /api 转发到 http://backend文章来源(Source):https://dqzboy.com/api,那么以下请求将被转发:
    • http://example.com/api
    • http://example.com/api/123
    • http://example.com/api/hello
  • 但是以下请求不会被转发:
    • http://example.com/api123
    • http://example.com/apixyz
  • 如果 location /api/ 转发到 http://backend/api/,那么以下请求将被转发:
    • http://example.com/api
    • http://example.com/api/123
    • http://example.com/api/hello
    • http://example.com/api/xyz

总之,需要根据实际情况选择是否在 location 后面的规则带斜杆,以确保请求能够正确地转发到指定的代理服务器。

反向代理配置:proxy_pass URL后面加斜杆和不加斜杆的区别


在Nginx反向代理中,URL后面加斜杆和不加斜杆是有区别的。如果URL后面不加斜杆,Nginx会认为这是一个文件或目录,会根据所配置的代理规则进行转发。

例如,如果请求的URL为 http://example.com/myapp,而代理规则为 proxy_pass http://127.0.0.1:8080/myapp;,则Nginx会将请求转发到 http://127.0.0.1:8080/myapp

如果URL后面加斜杆,Nginx会认为这是一个目录,会将请求转发到该目录下的默认页面或索引文件。例如,如果请求的URL为 http://example.com/myapp/,而代理规则为 proxy_pass http://127.0.0.1:8080/myapp/;,则Nginx会将请求转发到 http://127.0.0.1:8080/myapp/index.htmlhttp://127.0.0.1:8080/myapp/index.php 等默认页面。

因此,在配置Nginx反向代理时,需要根据实际情况选择是否在URL后面加斜杆,以确保请求能够正确地转发到目标服务器。当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。

location与proxy_pass结合实现反向代理的四种问题


问题描述

  • 问题1:location后面规则带斜杆,proxy_pass URL后面也带斜杆
  • 问题2:location后面规则不带斜杆,proxy_pass URL后面带斜杆
  • 问题3:location后面规则带斜杆,proxy_pass URL后面不带斜杆
  • 问题4:location后面规则不带斜杆,proxy_pass URL后面不带斜杆

上面四种情况下的转发请求的效果是啥?

问题剖析

问题1:location后面规则带斜杆,proxy_pass URL后面也带斜杆

  • 这种情况下,请求的URL中如果有斜杆,那么斜杆将被保留,请求将被转发到以 /proxy_pass_url/ 开头的URL。
# 例如,如果配置如下:
location /api/ {
    proxy_pass http://backend/api/;
}
  • 那么以下请求将被转发:
    • http://example.com/api/ -> http://backend/api/
    • http://example.com/api/users -> http://backend/api/users
    • http://example.com/api/users/123 -> http://backend/api/users/123

问题2:location后面规则不带斜杆,proxy_pass URL后面带斜杆

  • 这种情况下,请求的URL中如果没有斜杆,那么斜杆将被添加,请求将被转发到以 /proxy_pass_url/ 结尾的URL。
# 例如,如果配置如下:
location /api {
    proxy_pass http://backend/api/;
}
  • 那么以下请求将被转发:
    • http://example.com/api -> http://backend/api/
    • http://example.com/api/users -> http://backend/api/users/
    • http://example.com/api/users/123 -> http://backend/api/users/123/

问题3:location后面规则带斜杆,proxy_pass URL后面不带斜杆

  • 这种情况下,请求的URL中如果有斜杆,那么斜杆将被保留,请求将被转发到以 /proxy_pass_url 结尾的URL。
# 例如,如果配置如下:
location /api/ {
    proxy_pass http://backend/api;
}
  • 那么以下请求将被转发:
    • http://example.com/api/ -> http://backend/api
    • http://example.com/api/users -> http://backend/api/users
    • http://example.com/api/users/123 -> http://backend/api/users/123

问题4:location后面规则不带斜杆,proxy_pass URL后面不带斜杆

  • 这种情况下,请求的URL中如果没有斜杆,那么斜杆将被添加,请求将被转发到以 /proxy_pass_url 结尾的URL。
# 例如,如果配置如下:
location /api {
    proxy_pass http://backend/api;
}
  • 那么以下请求将被转发:
    • http://example.com/api -> http://backend/api
    • http://example.com/api/users -> http://backend/api/users
    • http://example.com/api/users/123 -> http://backend/api/users/123

问题总结

通过上述四种情况的说明,我们可以得出以下结论:

  • 当location后面规则和proxy_pass URL后面都带斜杆时,如果请求的URL中也带有斜杆,Nginx会将请求转发到proxy_pass指文章来源(Source):https://dqzboy.com定的URL;如果请求的URL中没有斜杆,Nginx会自动加上一个斜杆后再进行转发。
  • 当location后面规则不带斜杆,但proxy_pass URL后面带斜杆时,如果请求的URL中带有斜杆,Nginx会将请求转发到proxy_pass指定的URL;如果请求的URL中不带斜杆,Nginx会自动加上一个斜杆后再进行转发。
  • 当location后面规则带斜杆,但proxy_pass URL后面不带斜杆时,如果请求的URL中也带有斜杆,Nginx会将请求转发到proxy_pass指定的URL;如果请求的URL中没有斜杆,Nginx会自动去掉location后面规则中的斜杆后再进行转发。
  • 当location后面规则和proxy_pass URL后面都不带斜杆时,如果请求的URL中也不带斜杆,Nginx会将请求转发到proxy_pass指定的URL;如果请求的URL中带有斜杆,Nginx会自动去掉proxy_pass URL后面的斜杆后再进行转发。

这些区别可能看起来微小,但它们对于URL的匹配和转发却有很大的影响,因此在Nginx的配置中要特别注意。

以上就是本次文章所有知识点,如果文章对你有帮助就动动你那发财的小手,点个赞留个言,给本站加点热度。谢谢支持!

如果你有不同的见解可以在本文进行留言,我们一起进行探讨学习!

本文作者:浅时光博客
原文链接:https://www.dqzboy.com/13443.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可,转载时请以>超链接形式标明文章原始出处和作者信息
免责声明:本站内容仅供个人学习与研究,严禁用于商业或非法目的。请在下载后24小时内删除相应内容。继续浏览或下载即表明您接受上述条件,任何后果由用户自行承担。