似乎 Nginx 在与正则表达式一起使用时总是对 url 进行编码。我有一个重写规则:
location /api/ {
rewrite /api/(.*)$ $1 break;
proxy_pass http://127.0.0.1:8000/$1;
}
我想从 usl 中删除 api,但保留路径的其余部分。路径的一部分是电子邮件地址someone@somewhere.com。我正在传递某人%40somewhere.com,但 Nginx 用 @ 符号将其转回。
似乎 Nginx 在与正则表达式一起使用时总是对 url 进行编码。我有一个重写规则:
location /api/ {
rewrite /api/(.*)$ $1 break;
proxy_pass http://127.0.0.1:8000/$1;
}
我想从 usl 中删除 api,但保留路径的其余部分。路径的一部分是电子邮件地址someone@somewhere.com。我正在传递某人%40somewhere.com,但 Nginx 用 @ 符号将其转回。
正确答案似乎是
location /api/ {
rewrite ^ $request_uri;
rewrite ^/api/(.*) $1 break;
return 400;
proxy_pass http://127.0.0.1:8000/$uri;
}
有关完整答案和原作者,请参阅没有 url 解码的 Nginx pass_proxy 子目录。
(我意识到这个问题比我引用的那个问题要老,但我在谷歌搜索中发现了这个问题,可能不是最后一个,所以......)
这就是 Nginx 处理 url 的方式。您可以通过更改您的 Web 应用程序以将“%”字符转义为“%25”并通过来绕过它someone%2540somewhere.com
。
这将被转义为someone%40somewhere.com
.