Nginx 修改访问路径
项目中遇到了一个改写请求路径的问题,正好结合着Nginx的Http请求流程记录一下。
一、问题场景
location /Syrup/api {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 2;
proxy_read_timeout 50;
}
这个是开始的Nginx的conf文件,就是接收/Syrup/api的请求,然后转发到本地的8080端口上,但是这里有一个问题,就是我们的8080端口实际上是通过/api 来处理网络请求的
那么如果按照当前的配置,那么直接的请求就应该是:
http://127.0.0.1:8080/Syrup/api
可以看到这个/Syrup就是多余的了,因为我们的本地只处理/api开头的请求
二、Nginx的Rewrite
我们知道在Nginx中,一切皆模块的原则。同样一个复杂的Http请求也是通过很多的模块共同协作完成处理。
这个Rewrite是在11个处理阶段中的postread阶段,在find_config前后都会用到rewrite模块。
而这次我们就是用到rewrite模块中的rewrite指令来解决这个问题。
先看一下解决方案,然后我们再展开解释:
location /Syrup/api {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 2;
proxy_read_timeout 50;
rewrite "^/Syrup/(.*)$" /$1 break;
}
rewrite指令可以用于修改请求地址,实际操作的语法是:rewrite regex replacement [flag];
这个rewrite可以出现的上下文是:server , location , if
1.regex : 是代表要匹配的正则表达式,可以通过正则表达式提取变量
2.replacement : 要替换的url地址
3.flag : 是我们进行完替换之后,要进行的操作
所以rewrite指令就是将regex指定的url替换成replacement这个新的url,然后再执行flag操作。
flag对应的操作有四种:
1.last : 用replacement这个URL重新进行location的匹配
2.break : 停止当前脚本指令的执行,等价于独立的break指令,这里停止的脚本指令指的是停止rewrite模块内的所有脚本指令
3.redirect : 返回302重定向
4.permanent : 返回301重定向
所以上文中我们使用了break指令
然后我们再来看一下regex部分,这里我们是用到了常用的正则表达式:
代码 | 说明 |
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
代码 | 说明 |
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
我们上面是将/Syrup分割开,这里用$1引用前面正则表达式匹配到的分组(组编号从1开始),即/api/后面的所有内容