将 ASCII 百分比编码的位置重写为其 UTF-8 编码的等效项

Dan*_*iel 3 rewrite nginx utf-8

例如,“å”可以编码为 /%E5 和 /%C3%A5 (utf-8)。我所有的文件名都是 UTF-8,所以 ASCII 变体返回 404。我希望这两个变体都能工作。

我尝试使用以下配置的变体将不正确的 URL 重写为正确的编码。我无法真正匹配这些位置,所以没有到达任何地方。

rewrite ^/%E5$ /%C3%A permanent;
rewrite ^/%25E5$ /%25C3%25A permanent;
location = /%E5 { return 301 /%C3%A; }
Run Code Online (Sandbox Code Playgroud)

我应该如何匹配这些百分比编码的位置?

Sha*_*den 5

有关Apache 中的相同问题,请参见此处- 在那里,我建议使用外部程序来处理重写,因为在本机配置中执行此操作很笨拙。

对于nginx的,最好的办法可能会嵌入一些Perl配置中的通过ngx_http_perl_module-使用perl_set设置为一个UTF-8指明分数版本的变量$r->uri,使用Encoding模块(见这里),并重写(或可能更好,try_files)到.

编辑:

如果您只想针对特定 URL 或特定字符手动执行此操作,那么您在尝试中会遗漏以下几点:

  • 您正在处理转义的 URL,而在解码转义字符后应该针对字符串进行重写
  • 您将匹配项硬编码为包含特殊字符的文件,而不是包含特殊字符的文件

尝试这样的事情..

rewrite (*UTF8)^(.*)\xe5(.*)$ %1å%2;
Run Code Online (Sandbox Code Playgroud)