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/后面的所有内容

posted @ 2019-11-20 16:36  SyrupzZ  阅读(5814)  评论(0编辑  收藏  举报