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

将 ASCII 百分比编码的位置重写为其 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; }

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

答案1

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

对于 nginx,最好的方法可能是通过ngx_http_perl_module- 使用perl_set将变量设置为 UTF-8 版本的$r->uri,使用Encoding模块(请参阅这里),然后重写 (或者可能更好,try_files) 该文件。

编辑:

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

  • 你正在处理转义的 URL,而重写应该在解码转义字符后对字符串进行
  • 你对匹配项进行硬编码,使其适用于以下文件只是特殊字符,而不是文件包含特殊字符

尝试这样的事情..

rewrite (*UTF8)^(.*)\xe5(.*)$ %1å%2;

相关内容