我在 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
)。这是错误还是我做错了?
我还发现了这个相关问题: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_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 版本 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 脚本以您想要的方式生成索引。