关于nginx url重定向或者说url重写

想使用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;
        }

发表回复

您的电子邮箱地址不会被公开。