想使用nginx把请求的url如
http://example.test/aa
给反向代理proxy_pass到
http://127.0.0.1:8081/bb/cc/aa
结果弄了半天,各种搜索什么location、root、alias、proxy_pass、rewrite之类的教程,亏得工作了这么多年,差点儿还没弄得出来,也是花了个多小时才解决。主要是以往的经历中基本都是给nginx配置个php,加个fastcgi_pass啥的,或者配置下静态资源的目录路径,最多来个return 啥的跳转重定向。
像proxy_pass也有遇到过,不过情况都比较简单,直接填好ip和端口号就完了,哪想再处理下url会这么麻烦哟。
最开始想到的办法就是使用 root或alias
location ~ /aa { root /bb/cc/; }
或者
location ~ /aa { alias /bb/cc/aa; }
结果都不行,一直404。
然后又想直接改下proxy_pass的url
location ~ /aa { proxy_pass http://127.0.1:8081/bb/cc/aa; proxy_set_header Host $host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 60; }
结果nginx直接歇菜了,报个[emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except"的错误。后面才知道原来location正则模式中proxy_pass的url不能有/,中间又在那儿试着把root或者 alias和proxy_pass都放到location里,结果还是不行。后面又搜了rewrite看起来又redirect那种跳转之类的,真的是找了好久都没看到有人把这几个关键词组合使用的,都是在讲单个用法。
直到后面把饭吃了再瞅了rewrite有个last模式,试了下才算达到要的效果。之前是饿着有点儿焦了,有些用法是没看得细。
然后后面想了下才大概知道了root、alias这个包括还有个try_file估计都是只针对已存在的文件,也就是静态资源的路径。proxy_pass之类的只能使用rewrite了。
rewrite ^/aa(.*)$ /bb/cc/aa$1 last;
既可以放在location外面也可以放在location里面,使用倒是挺灵活,估计也可以代替root和alias的功能吧。
最终解决么还是放在location里,和proxy_pass一起使用好些,不然放外面每次都会去执行下。
location ~ /aa { proxy_pass http://127.0.1:8081; proxy_set_header Host $host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 60; rewrite ^/aa(.*)$ /bb/cc/aa$1 last; }
另外也可以只使用proxy_pass
location /aa { proxy_pass http://127.0.1:8081/bb/cc/aa; proxy_set_header Host $host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 60; }