nginx转发url中的参数的地址

在实际项目中,由于https安全策略,我们无法直接跳转到我们想要跳转到的地址

一、使用

例如 url:https://abc.dc.com/image?url=https://vpic.video.qq.com/1641213/p0685fxrwij.png

我们想要的效果直接访问以下地址:

https://vpic.video.qq.com/1641213/p0685fxrwij.png

如果是在代码中,我们可以通过正则表达式,字符串截取,xpath等方式很容易获取以上地址。

但我这边想要达到的效果是:我们直接请求服务器,服务器自动去识别并访问到我需要的资源,如果你的项目中用到了nginx,那么我要恭喜你,你离成功只差一步了,哈哈。

鉴于有些小盆友可能对nginx还不太熟悉,我简单介绍一下:

 Nginx是一个高性能的HTTP和反向代理服务,可以用于搭建轻量级web服务器及反向代理服务器,可以通过反向代理实现负载均衡,支持高并发,占用内存率比较小,nginx可以配置多个域名映射同一映射地址。

我们言归正传把,在nginx.conf增加以下配置信息

 resolver 8.8.8.8; #配置域名进行访问的时候,需要配置此项目,否则会报502错误

location ~/image {
      if ($query_string ~*  ^(.*)url=(.*)$){
           set $imageUrl $2;
           proxy_pass $imageUrl;
      }
 }

重启nginx即可生效

在nginx用$query_string表示问号后面的请求参数(例如http://192.168.71.51:6061/do1.aspx?t=1212&c=uplog中$query_string所代表的的就是t=1212&c=uplog所以在用到$query_string如上面的使用案例,一定要在其前面加上?

二、扩展

详细可参考博客中的这篇文章(https://www.cnblogs.com/softidea/p/5664721.html

nginx 各参数翻译,作用

$arg_PARAMETER #这个变量包含GET请求中,如果有变量PARAMETER时的值。

$args #这个变量等于请求行中(GET请求)的参数,例如foo=123&bar=blahblah;

$binary_remote_addr #二进制的客户地址。

$body_bytes_sent #响应时送出的body字节数数量。即使连接中断,这个数据也是精确的。

$content_length #请求头中的Content-length字段。

$content_type #请求头中的Content-Type字段。

$cookie_COOKIE #cookie COOKIE变量的值

$document_root #当前请求在root指令中指定的值。

$document_uri #与$uri相同。

$host #请求主机头字段,否则为服务器名称。

$hostname #Set to the machine’s hostname as returned by gethostname

$http_HEADER

$is_args #如果有$args参数,这个变量等于”?”,否则等于”",空值。

$http_user_agent #客户端agent信息

$http_cookie #客户端cookie信息

$limit_rate #这个变量可以限制连接速率。

$query_string #与$args相同。

$request_body_file #客户端请求主体信息的临时文件名。

$request_method #客户端请求的动作,通常为GET或POST。

$remote_addr #客户端的IP地址。

$remote_port #客户端的端口。

$remote_user #已经经过Auth Basic Module验证的用户名。

$request_completion #如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty)。

$request_method #GET或POST

$request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。

$request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。不能修改。

$scheme #HTTP方法(如http,https)。

$server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

$server_addr #服务器地址,在完成一次系统调用后可以确定这个值。

$server_name #服务器名称。

$server_port #请求到达服务器的端口号。

$uri #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。该值有可能和$request_uri 不一致。$request_uri是浏览器发过来的值。该值是rewrite后的值。例如做了internal redirects后。

rewrite通过正则表达式的使用来改变URI,可以同时存在一个或者多个指令,按照顺序依次对URL进行匹配和处理(使用break可以依次处理,其它不可以)。


rewrite语法:rewrite regex replacement [falg];regex用于匹配URI的正则表达式。使用括号“()”标记想要截取的内容。
flag由以下几个选项:last,break,redirect,permanent

说明:
rewrite接收到的URI不包含host地址。因此regex不可能匹配到URI的host地址
例如URL:  http://myweb.com/source?arg1=value1&arg2=value2
rewrite指令接收到的URI为"/source“,不包含"?arg1=value1&arg2=value2"
replace,匹配成功后用于替换URI中被截取内容的字符串。默认情况下,如果该字符串是由”http://"或者"https://"开头的,则不会继续向下对URI进行其它处理,而直接将重写后的URI返回给客户端。

rewrite模块接收到的URI不包含URL中的请求信息(queryString),如果我们希望将这些指令传给重写后的URI,需要怎么做呢?
Nginx全局变量$request_uri可以帮忙,
rewrite  myweb.com  http://example.com$request_uri? permanent;

处理query_string
1、什么是query_string:
http://i.cnblogs.com/EditPosts.aspx?opt=1

上面链接中的?后面的opt=1就是query_string,即url中?后面的都是


2、nginx中如何获取到上面的值。本例以query_string有一个key为例,多个就是多个正则引用$1,$2的区别而已
nginx中全局变量$args和$query_string中存放的数据就是请求的url中带的query_string
如何获取query_string中key对应的value呢,以上面的链接为例,就是key:opt 对应的value: 1
(1)方法1:下面使用了permanent,因为使用last没有生效。那个大神给看看是什么原因
last没有生效的原因是:
last,终止继续在本location块中处理接收到的URI,并将此处重写的URI作为一个新的URI,使用各location块进行处理。
last标志将重写后的URI重新在server块中执行,为重写后的URI提供了转入到其它location块的机会
看到这时,是不是有的小伙伴已经发现一个bug,下面的是不是就死循环了:
location /myweb/{

  rewrite ^(/myweb/.*)/media/(.*)\..*$  myweb/$1/mp3/$2.mp3 last;

}
的确会出现死循环,
因为使用last,相当于一个新请求进来,再重新走一遍location。重写后的URI会被该location块重新匹配到
Nginx服务器遇到这种情况,会尝试10次循环之后返回错误状态代码500

rewrite中与last容易混淆的几个用来设置rewrite对URI处理行为的flag,也简单介绍一下:
break,将此处重写的URI作为一个新的URI,在本块中继续进行处理。该标志将重写后的地址在当前的location块中执行,不会将新的URI转向到其他location块
redirect,将重写后的URI返回给客户端,状态代码为302,指明是临时重定向URI,主要用在replacement变量不是以"http://"或"https://"开头的情况下
permanent,将重写后的URI返回给客户端,状态代码301,指明是永久重定向URI,

location /EditPosts.aspx {
            if ($args ~ opt=(\d+)){
	        set $opt $1;  #将截取到的opt对应的值$1赋值给变量$opt(变量必须以$开头,并且不能与nginx预设的全局变量同名)以备后用。
                rewrite  /(.*)\.aspx  /$1/$opt? permanent;   #最后的?很关键,表示正则结束,不然rewrite后的url会变成/EditPosts/1?opt=1
            }
 }

在正则表达式中可以,可以使用小括号对变量值进行截取,在花括号中使用$1...$9引用截取的值(注意,$后面的数字从1开始的哦)

(2)方法2:

      location /EditPosts.aspx {
            if ($args ~ opt=(\d+)){
                rewrite  /(\w*)\.aspx  /$1/$arg_opt? permanent; #即$arg_query_string中key代表的字符串  				
            }  	
        }	

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值