如何逃离&引用;在nginx中重写规则输出

如何逃离&引用;在nginx中重写规则输出,nginx,url-rewriting,escaping,reverse-proxy,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\?

我试图在
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

感谢@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
rewrite指令做一些更一般的事情,但是我无法在Amazon Linux 2机器上安装mod lua,请参见

@RichardSmith,我认为这是不同的。我能在RFC里找到的最好的是你,还有?是一个保留字符。当然,Chrome会以不同的方式对待它们,例如,
newURL(“http://www.example.com/a%3fb“”。路径名=='/a%3fb'
新URL(“”http://www.example.com/a?b)。路径名==='/a'
。这似乎是可能的,但不使用
rewrite
指令。将URI(或包含URI的变量)附加到
proxy\u pass
指令将不受干扰地向上游传递。@RichardSmith--区别在于“
/a/b?page=2
”的路径为“
/a/b
”和查询字符串,而
/a/b%3fpage=2
的路径为“
/a/b%3fpage=2
”,并且没有查询字符串。在大多数Web服务器上,后者将提供名为“
b?page=2
”的文件(对于文件名中允许“?”的文件系统),另请参见