例如,“å” 可以编码为 /%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;