如何逃脱“?”在nginx重写规则输出中

时间:2019-04-02 15:39:44

标签: nginx url-rewriting escaping reverse-proxy

我正在尝试在nginx中反向代理,将“ /a/b?page=2”之类的前端页面重写为对“ /a/b%3fpage=2”的后端请求

我无法弄清楚如何获得nginx来进行包含“ %3f”的反向代理请求。

使用以下配置:

rewrite ^/one$ /a%3fb;
rewrite ^/two$ /a?b;
rewrite ^/three$ /a\?b;
  • /one发出类似于GET /a%253fb HTTP/1.0的后端请求
  • /two发出类似于GET /a?b HTTP/1.0的后端请求
  • /three发出类似于GET /a\?b HTTP/1.0的后端请求

如何获得GET /a%3fb HTTP/1.0之类的后端请求?

1 个答案:

答案 0 :(得分:1)

由于@Richard Smith的评论,我能够使用以下代码针对我的特定情况解决此问题:

location / {

  set $backend_uri $request_uri;
  if ($args ~* "page=(\d+)") {
    set $page $1;
    set $backend_uri $uri%3fpage=$1;
  }

  proxy_pass http://example.com$backend_uri;
}

我认为我也可以使用lua重写指令来执行更常规的操作,但是我无法在Amazon Linux 2计算机上安装mod-lua,请参见https://serverfault.com/questions/961337/how-to-install-nginx-mod-lua-on-amazon-linux-2 < / p>