解决Markdown源码在线查看中文乱码

前段时间更改Hugo主题,然后配置使其可以生成markdown格式的文件以供在线查看。然后,我发现在线查看Markdown文件源码时所有中文都变成了乱码。因为我的文件保存的都是UTF-8格式,所以初步判断是Nginx服务的默认语言不是UTF-8导致,查阅官方文档,使用以下配置,然后运行nginx -s reload解决问题。

http {
        ......
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
        map $sent_http_content_type $charset {
          ~^text/   utf-8;
        }
        charset       $charset;
        charset_types *;
        ......
}
serve {
        ......
        charset utf-8;
        ......
}

mime.types与Markdown文件格式

/etc/nginx/mime.types这个文件里面存储了Nginx用于分辨不同文件名后缀的文件类型,以方便客户端浏览器进行相应的响应。举个例子:比如我们在浏览器某个网站点击一个二进制文件(后缀.exe),一般是没有预览功能而会直接进入到下载状态。如果这个文件是PDF(后缀.pdf)或者其他纯文本文件(后缀.txt),一般浏览器会进入一个在线查看的新界面,而不是直接下载。

# /etc/nginx/mime.types
text/html                             html htm shtml;
......
image/tiff                            tif tiff;
application/zip                       zip;
application/octet-stream              dmg;
audio/mpeg                            mp3;
video/mp4                             mp4;
......

在这个文件里面,默认是没有markdown这种文件格式的,如果你想让用户可以在线查看markdown源代码,而不是直接下载,你需要在/etc/nginx/mime.types增加相应的配置:

text/markdown                         markdown md;

当然,你也可以选择使用Hugo的配置文件进行相应配置,效果类似:

# 使 hugo 生成 .md 文件
# Make hugo output .md files.
[mediaTypes]
  [mediaTypes."text/plain"]
    suffixes = ["md", "markdown"]

[outputFormats.MarkDown]
  mediaType = "text/plain"
  isPlainText = true
  isHTML = false

[outputs]
  home = ["HTML", "RSS"]
  page = ["HTML", "MarkDown"]
  section = ["HTML", "RSS"]
  taxonomy = ["HTML", "RSS"]
  taxonomyTerm = ["HTML"]