nginx反向代理是平常使用nginx时最经常使用到的功能之一。在配置url的过程当中,“/”的有无常常是影响咱们配置成功的关键,也是困扰咱们的问题所在。在此,结合实际例子,做简要辨析。html
场景一:利用根目录进行代理nginx
location / { proxy_pass http://example.test.com/; } location / { proxy_pass http://example.test.com; }
这两个配置实现的效果是同样的。url
场景二:下面四种状况分别用http://192.168.1.10/proxy/test.html 进行访问。spa
第一种状况: location /proxy/ { proxy_pass http://127.0.0.1:8080/; }
实现效果:当访问http://192.168.1.10/proxy/test.html时,会被代理到http://127.0.0.1:8080/test.html 这个url,并将结果返回给咱们。代理
第二种状况:(相对于第一种,最后少一个 /) location /proxy/ { proxy_pass http://127.0.0.1:8080; }
实现效果:当访问http://192.168.1.10/proxy/test.html时,会被代理到http://127.0.0.1:8080/proxy/test.html 这个url,并将结果返回给咱们。code
第三种状况: location /proxy/ { proxy_pass http://127.0.0.1:8080/real/; }
实现效果:当访问http://192.168.1.10/proxy/test.html时,会被代理到http://127.0.0.1:8080/real/test.html 这个url,并将结果返回给咱们。server
第四种状况(相对于第三种,最后少一个 / ): location /proxy/ { proxy_pass http://127.0.0.1:8080/real; }
实现效果:当访问http://192.168.1.10/proxy/test.html时,会被代理到http://127.0.0.1:81/realtest.html 这个url,并将结果返回给咱们。htm
分析以下: proxy_pass http://127.0.0.1/ 和proxy_pass http://127.0.0.1 ==>这个”/”,会使代理出来的结果彻底不一样。blog
前者,至关于告诉nginx,我这个location,是代理访问到http://127.0.0.1这个server的,个人location是什么,nginx 就把location 加在proxy_pass 的 server 后面,这里是/proxy/,因此就至关于http://127.0.0.1/proxy/。若是是location /blog/ 就是代理访问到http://127.0.0.1/blog/。io
后者,至关于告诉nginx,我这个location,是代理访问到http://127.0.0.1/的,http://127.0.0.1/proxy/ == http://127.0.0.1/ ,能够这样理解。改变location,并不能改变返回的内容,返回的内容始终是http://127.0.0.1/ 。 若是是location /blog/ ,那就是 http://127.0.0.1/blog/ == http://127.0.0.1/ 。
这样,也能够解释了上面那个location / 的例子,/ 嘛,加在server 的后面,仍然是 / ,因此,两种写法出来的结果是同样的。
注意: 若是是 location ~* ^/proxy/(.*)\.html 这种正则的location,是不能写”/”上去的,nginx -t 也会报错的了。由于,路径都须要正则匹配了嘛,并非一个相对固定的locatin了,必然要代理到一个server。