重写请求url以匹配查询字符串和规范化

时间:2018-11-10 20:18:37

标签: nginx

我有一个简单的nginx转发代理,配置为:

server {
     listen                         8000;    
     resolver                       8.8.8.8;    
     location / {
         set_unescape_uri $url $arg_url;    # obtain the decoded request
         # rewrite $request_uri $url;
         # set $request_uri $url;           # won't work, not writeable
         proxy_pass http://$host;
         proxy_set_header Host $host;
     }
 }

请注意,set_unescape_uri指令需要Nginx Set Misc module

如果未对客户端进行防火墙,则服务器可以正常工作,服务器记录连接的方式如下:

GET http://www.example.com/ HTTP/1.1

但是,如果客户端位于防火墙后面,则发送到代理服务器的请求如下所示:

GET http://www.clientfirewall.com/path/rewrite.do?url=http%3A%2F%2Fwww.example.com HTTP/1.1

很明显,防火墙做了两件事:

  1. 百分比对$request_uri进行编码,并且
  2. 在编码后的$request_uri前面加上前缀。

所以我的任务是撤销他们的工作,即删除前缀并将已解码的请求发送到代理。我的第一个尝试(上面的两行注释是)用解码后的值$request_uri重新填充了变量$url,然后我意识到变量$request_uri是内置的nginx,因此不可写。

我的第二个尝试是使用重写规则,然后我了解到规则处理URL的路径部分,无法更改http://www.clientisp.com部分。

我无法选择吗?还有解决方法,将更改后的$request_uri发送到上游代理服务器?

编辑:为简洁起见,将这个问题重写了。

0 个答案:

没有答案