我在 Windows 10 上使用 nginx 1.17.8。在我设置的配置中autoindex on
,它工作正常。但是随后一些带有特殊字符的文件被错误编码/弄乱了:
自动生成的链接Prüfstand.jpg
是Pr%FCfstand.jpg
,但我需要它是Pr%C3%BCfstand.jpg
。
编辑 1:根据以下用户的建议,您需要设置字符集设置。我已经尝试了这些设置(不起作用):
include win-utf;
source_charset windows-1251;
charset utf-8;
override_charset on;
编辑2:现在我目前坚持使用这些设置,我认为这些设置应该可以正常工作:
charset_map windows-1251 utf-8 {
FC C3BC ; # ü
}
charset_types *;
source_charset windows-1251;
charset utf-8;
override_charset on;
这些设置正在影响编码。如果我注释掉FC C3BC ;
,则 ü 不会正确转换。如您所见,设置处于活动状态。但问题仍然是,自动生成的链接是错误的(Pr%FCfstand.jpg
)。我检查了响应标头:
HTTP/1.1 200 OK
Server: nginx/1.17.8
Date: Mon, 02 Mar 2020 19:15:18 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
他们也很好(charset=utf-8
)。这是一个错误还是我做错了什么?
我还发现了这个相关的问题:autoindex list UTF-8 charset in Nginx这似乎很相似。但是作者没有提供足够的信息让我确定这是同一个问题。
nginx windows build (1.17.8)的autoindex 模块不支持给它一个编码的任何选项。因此,它将使用它正在读取的数据的基础或受字符集设置的影响。您面临的可能是该模块中的错误。
在 Windows 上,这通常是具有特定代码页编码的数据,该代码页取决于区域。在这种情况下,nginx 似乎使用了Windows-1251 。其他一些可能相关的编码是 ISO-8859-1、ISO-8859-15、Windows-1252或 UTF-16。
您已经指出 ü as 的编码
FC
多次错误,但实际上并非如此。即使在unicode中,它也应该是 FC。碰巧在 UTF-8 中它是C3 BC
. 有关更多字符比较,请查看torsten-horn.de: Text-Encoding, Codepage, Charset。如果您启用它,您的帖子中没有包含一条错误消息,该消息会显示在错误日志中:随着 MWE 进一步下降,它也不仅仅是一个简单的 404,而是一个 500。
该错误暗示了编码问题。您将使用ngx_http_charset_module的一种方法来修复它。您已将其包含在您的编辑中。如果您只定义 a
source_charset
并且charset
您将收到一条错误消息nginx: [emerg] no "charset_map" between the charsets "windows-1251" and "utf-8"
,并且提供的 win-utf 映射文件不包含您需要的映射。它将 FC 编码为FC D18C ; # small soft sign
( ь )。您需要的是Windows-1252地图。现在为什么我认为 autoindex 和/或 windows nginx 构建中存在错误?下面基于 nginx Windows build 1.17.8 的默认配置文件的 MWE 执行从 d 到 ü 的转换,并重写链接,
http://localhost/Pr%FCfstan%C3%BC.txt
但不会触及,%FC
尽管它会显示为 ü。副作用是所有 ds 都被替换为 üs。以 word 为例Index
。至少在一种情况下(无法再次找到该链接)有人通过在 Windows 上进行自己的构建而成功。或者,您可以使用例如 PHP 脚本以您想要的方式生成索引。