【发布时间】:2021-11-18 10:14:51
【问题描述】:
我正在尝试使用 Nginx (1.21.3) 重写,但不知何故,它在字符串中的第一个位置删除了 / 键。
重写规则:
#nginx not relevant conf here
location / {
rewrite ^(.*)data/([0-9]+)/(.+)?$ $1processor.php?key=$2&data=$3 last;
}
#nginx not relevant conf here
当我对我测试过的任何 url 使用此重写规则时,一切正常。当我尝试像下面的示例这样的 url 时,它以某种方式在开头省略了 /。
https://example.com/data/9/%2F*-%2B.%60!%40%23%24%25%5E%26*()_%2B%60-%3D%5B%5D%3B%27%5C%2C.%2F%7B%7D%3A%22%7C%3C%3E%3F
当我用通知重新加载 nginx 和 rewrite_log=on; 时,我得到了输出:
2021/09/25 13:08:29 [notice] 528#528: *11710 "^(.*)data/([0-9]+)/(.+)?$" matches "/data/199/*-+.`!@#$%^&*()_+`-=[];'\,./{}:"|<>?", client: 192.168.255.107, server: localhost, request: "GET /data/199/%2F%2A-%2B.%60%21%40%23%24%25%5E%26%2A%28%29_%2B%60-%3D%5B%5D%3B%27%5C%2C.%2F%7B%7D%3A%22%7C%3C%3E%3F HTTP/2.0", host: "example.com", referrer: "https://example.com/"
PHP (8.0.10) $_GET["data"] 输出是(如您所见,没有/,因此不是精确的数学):
*-+.`!@#$%^&*()_+`-=[];'\,./{}:"|<>?
我该如何解决?
【问题讨论】:
-
这似乎是bug in Nginx。我建议您将其传递为base64 encoded string