nginx - 文件列表编码混乱

nginx - 文件列表编码混乱

我在 Windows 10 上使用 nginx 1.17.8。在配置中我设置了autoindex on,运行正常。但是一些带有特殊字符的文件被错误编码/弄乱了:
自动生成的链接Prüfstand.jpgPr%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)。这是错误还是我做错了?
我还发现了这个相关问题:Nginx 中的自动索引列表 UTF-8 字符集看起来相似。但是作者没有提供足够的信息让我确定这是同一个问题。

答案1

自动索引模块nginx windows build (1.17.8) 不支持任何为其指定编码的选项。因此,它将使用所读取数据的基础或受字符集设置的影响。您遇到的问题可能是该模块中的错误。

在 Windows 上,这通常是具有特定代码页编码的数据,该代码页与区域相关。在这种情况下Windows-1251似乎由 nginx 使用。其他可能相关的编码包括 ISO-8859-1、ISO-8859-15、Windows-1252或 UTF-16。

您多次指出 ü 的编码FC是错误的,但事实并非如此。即使在统一码应该是 FC。恰巧在 UTF-8 中是C3 BC。有关更多字符比较,请查看torsten-horn.de:文本编码、代码页、字符集。您在帖子中没有包含的是在启用它时显示在错误日志中的错误消息:

... [crit] 5408#9820: *19 CreateFile() "C:\nginx-1.17.8/html/Prüfstand.txt" failed (1113: No mapping for the Unicode character exists in the target multi-byte code page), client: 127.0.0.1, server: localhost, request: "GET /Pr%FCfstand.txt HTTP/1.1", host: "localhost", referrer: "http://localhost/"

随着 MWE 进一步下降,它也不再是简单的 404,而是 500。

该错误提示存在编码问题。您可以使用以下方法之一ngx_http_charset_module来修复它。您已将其包含在编辑中。如果您只定义一个source_charsetcharset您将收到一条错误消息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 版本 1.17.8 的默认配置文件的 MWE 会将 d 转换为 ü,并重写链接,但http://localhost/Pr%FCfstan%C3%BC.txt不会触及,%FC尽管它会显示为 ü。副作用是所有 d 都被替换为 üs。以 word 为例Index

worker_processes  1;

error_log  logs/error.log;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    charset utf-8;
    source_charset windows-1251;
    charset_map  windows-1251  utf-8 {
        64  C3BC; # d -> ü
        FC  C3BC; # ü -> ü
    }

    server {
        listen       80;
        server_name  localhost;

        location / {
            root html;
            autoindex on;
            index  index.html index.htm;
        }
    }
}

至少有一个案例(无法再次找到该链接),有人通过这样做获得了成功在 Windows 上自行构建。或者,您可以使用例如 PHP 脚本以您想要的方式生成索引。

相关内容