登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

学无止境

一点积累,与大家分享

 
 
 

日志

 
 

nginx location节点 proxy_pass 中的”/”  

2011-06-01 15:58:19|  分类: web架构 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

原文1:http://www.51yu.cn/post/183/
原文2:http://blog.helosa.org/2010/02/10/nginx-proxy_pass.html
在nginx中配置proxy_pass时,如果是按照^~匹配路径时

要注意proxy_pass后的url最后的/

当加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走

如果没有/,则会把匹配的路径部分也给代理走

01.location ^~ /static_js/
02.{
03.proxy_cache js_cache;
04.proxy_set_header Host js.test.com;
05.proxy_pass http://js.test.com/;
06.}

如上面的配置,如果请求的url是http://servername/static_js/test.html
会被代理成http://js.test.com/test.html
而如果这么配置:

01.location ^~ /static_js/
02.{
03.proxy_cache js_cache;
04.proxy_set_header Host js.test.com;
05.proxy_pass  http://js.test.com;
06.}

则会被代理到http://js.test.com/static_js/test.htm
当然,我们可以用如下的rewrite来实现/的功能

location ^~ /static_js/
{
proxy_cache js_cache;
proxy_set_header Host js.test.com;
rewrite /static_js/(.+)$ /$1 break;
proxy_pass http://js.test.com;
}

见配置,摘自nginx.conf 里的server 段:

server {
listen 80;
server_name abc.163.com ;
location / {
proxy_pass http://ent.163.com/ ;
}
location /star/ {
proxy_pass http://ent.163.com ;
}
}


里面有两个location,我先说第一个,/ 。其实这里有两种写法,分别是:



location / {
proxy_pass http://ent.163.com/ ;
}


location / {
proxy_pass http://ent.163.com ;
}


出来的效果都一样的。



第二个location,/star/。同样两种写法都有,都出来的结果,就不一样了。



location /star/ {
proxy_pass http://ent.163.com ;
}


当访问 http://abc.163.com/star/ 的时候,nginx 会代理访问到 http://ent.163.com/star/ ,并返回给我们。



location /star/ {
proxy_pass http://ent.163.com/ ;
}


当访问 http://abc.163.com/star/ 的时候,nginx 会代理访问到 http://ent.163.com/ ,并返回给我们。



这两段配置,分别在于, proxy_pass http://ent.163.com/ ; 这个”/”,令到出来的结果完全不同。



前 者,相当于告诉nginx,我这个location,是代理访问到http://ent.163.com 这个server的,我的location是什么,nginx 就把location 加在proxy_pass 的 server 后面,这里是/star/,所以就相当于 http://ent.163.com/star/。如果是location /blog/ ,就是代理访问到 http://ent.163.com/blog/。



后者,相当于告诉nginx,我这个location,是代理访问 到http://ent.163.com/的,http://abc.163.com/star/ == http://ent.163.com/ ,可以这样理解。改变location,并不能改变返回的内容,返回的内容始终是http://ent.163.com/ 。 如果是location /blog/ ,那就是 http://abc.163.com/blog/ == http://ent.163.com/ 。



这样,也可以解释了上面那个location / 的例子,/ 嘛,加在server 的后面,仍然是 / ,所以,两种写法出来的结果是一样的。



PS: 如果是 location ~* ^/start/(.*)\.html 这种正则的location,是不能写”/”上去的,nginx -t 也会报错的了。因为,路径都需要正则匹配了嘛,并不是一个相对固定的locatin了,必然要代理到一个server。

  评论这张
 
阅读(1740)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018