Nginx 重写 unencodes url

Ram*_*yer 5 nginx

似乎 Nginx 在与正则表达式一起使用时总是对 url 进行解编码。我有一个重写规则:

location /api/ {
    rewrite /api/(.*)$ $1 break;
    proxy_pass http://127.0.0.1:8000/$1;
}
Run Code Online (Sandbox Code Playgroud)

我想从 usl 中删除 api 但保留路径的其余部分。路径的一部分是电子邮件地址 someone@somewhere.com。我正在通过某人 %40somewhere.com 但 Nginx 正在用 @ 符号将它转回来。

小智 6

正确答案似乎是

location /api/ {
        rewrite ^ $request_uri;
        rewrite ^/api/(.*) $1 break;
        return 400;
        proxy_pass http://127.0.0.1:8000/$uri;
    }
Run Code Online (Sandbox Code Playgroud)

请参阅Nginx pass_proxy 子目录,无需 url 解码以获取完整答案和原作者。

(我意识到这个问题比我引用的问题要早,但我在谷歌搜索中发现了这个问题,可能不是最后一个问题,所以......)


Day*_*ayo 2

这就是 Nginx 处理 url 的方式。您可以通过更改 Web 应用程序将“%”字符转义为“%25”并传递 来绕过它someone%2540somewhere.com

这将不会被转义为someone%40somewhere.com.