Nginx配置
Nginx配置中的location指令和proxy_pass指令
location指令中的路径匹配中有一个前缀匹配的模式,它以^~
开头,作用是对uri以某个常规字符串开头进行匹配,也称该匹配的字符串为前缀字符串。例如如下:
server{
listen 80;
server_name localhost;
location ^~/ROOT {
root html;
index index.html index.htm;
}
}
它会对请求过来的url进行以前缀字符串为"ROOT"进行匹配,请求路径中必须包含前缀字符串”ROOT“。它可以匹配如下请求路径:
http://localhost:80/ROOT/123;
http://localhost:80/ROOT123/123;
http://localhost:80/ROOT/ROOT123/123;
但是不能匹配像下面这些路径:
http://localhost:80/ROO/ROOT/123; 不是以规定的前缀字符串开头,即使后面出现了完整的前缀字符串
http://localhost:80/ROO/123; 前缀字符串不完整
这就是对于location前缀匹配中的一些注意点。具体的其他匹配规则(正则匹配,精确匹配和通用匹配以及他们的优先级可以看此的链接,讲的非常详细!Nginx之location详解)
proxy_pass指令:简单来说是用于反向代理的一个指令,它是内嵌在location指令块中一起使用的。
在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。(这句话很关键!!! )
当它和location中前缀匹配一起使用时就会出现一些细节问题,具体如下:
我通过proxy_pass指令反向代理到Tomcat服务器上,配置如下:
两种情况之一:proxy_pass后面的url不加 / :
# 定义一组Tomcat服务器负载均衡
upstream httpds{
server 192.168.159.132:8080 weight=5;
}
# 反向代理服务器
server {
listen 80;
server_name localhost;
location ^~/abc {
proxy_pass http://httpds;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
然后在Tomcat服务器上的ROOT文件目录如下:(跳转成功后默认访问此目录)
然后请求路径如下:
可以看出该请求路径已经通过nginx的反向代理转发到了Tomcat中,但是由于proxy_pass指令的规则,如果在proxy_pass后面的url加/,则会带上location上的匹配路径的那一部分,但是Tomcat根据ip/abc/该目录无法找到所要请求的资源,所以返回Tomcat下的404。
带上匹配路径的那一部分(abcde)
然后我们在webapp新建一个项目名叫abcde与uri相同:其中index.html内容就是”abcde"。
然后再刷新以下浏览器:
成功显示页面。
两种情况之二:proxy_pass后面的url加 / :
# 定义一组Tomcat服务器负载均衡
upstream httpds{
server 192.168.159.132:8080 weight=5;
}
# 反向代理服务器
server {
listen 80;
server_name localhost;
location ^~/abc {
proxy_pass http://httpds/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
通过同样的请求路径进行访问:
成功显示页面。
然后以adcde请求uri进行访问:
可以看到最终会去掉前缀字符串abc以/de/的uri路径去寻找请求的资源
同理在webapp新建一个项目名叫de与uri相同:其中index.html内容就是”de"。:
然后刷新浏览器成功显示。
如果我们以这样的请求路径去访问,会得到这样的一个结果:
如果proxy_pass后面的rul加上/不适合多级目录下的请求。
总结
location指令的前缀匹配与proxy_pass指令一起结合使用需要注意的:如果在proxy_pass后面的url加/,表示绝对根路径,并且会加上去掉前缀字符串(abc)加上剩下的那一部分(de)uri作为请求路径,并且不适合多级目录下的请求;如果没有/,表示相对路径,把匹配的路径部分也给代理走。
本文作者:sunshineTv
本文链接:https://www.cnblogs.com/sunshineTv/p/16443788.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步