如何将Apache的默认编码更改为UTF-8

153

我正在使用一个托管公司,如果文件夹中没有index.html文件,它将列出该目录中的文件。它使用ISO 8859-1作为默认编码。

如果服务器是Apache,有没有一种方法可以将UTF-8设置为默认编码呢?

我发现它实际上使用的是HTML 3.2的DOCTYPE,然后根本没有charset...所以它没有设置任何编码方式。但是有没有一种方法可以将它更改为使用UTF-8呢?


1
这个问题非常古老,但是目前(2021年),至少在我的情况下(Debian 10),utf-8字符被正确地提供,似乎根本不需要取消注释或更改设置AddDefaultCharset为utf-8(在Debian上,它位于/etc/apache2/conf-available/charset.conf)。 - aderchox
13个回答

194

在httpd.conf中添加以下内容(如果已经存在则进行修改):

AddDefaultCharset utf-8

6
在文件中添加这个内容应该放在哪里?随意位置都可以吗? - Geoffrey
5
@Geoffrey 是的。如果还没有,请把它放在任何地方。然而,出于多种原因(覆盖预设指令、顺序和便于查看从默认配置所做的更改),我通常会把每个“自定义”指令放在文件底部。 - MartinodF
6
如果您无法访问httpd.conf,可以在 .htaccess 文件中添加 AddDefaultCharset utf-8,这对我非常有效。 - richardwhitney
这个问题是否认为与我的问题相关?https://stackoverflow.com/questions/52576913/generate-a-link-with-utf-8-values-and-passing-it-to-a-flask-route/52997942?noredirect=1#comment92948706_52997942 我确实尝试将此指令添加到httpd.conf中,但问题仍然存在。 - Νικόλαος Βέργος
12
由于这个答案是来自2009年的:在Ubuntu 18中,你可以在/etc/apache2/conf-available/charset.conf中更改这个配置。 - WoodrowShigeru
显示剩余3条评论

63
将以下内容添加到您的.htaccess文件中:
IndexOptions +Charset=UTF-8

或者,如果您具有管理员权限,可以通过编辑 httpd.conf 并添加以下内容来全局设置:

AddDefaultCharset UTF-8

你也可以在.htaccess文件中使用AddDefaultCharset,但这种方式不会影响Apache生成的目录列表。


4
这是一个很好的解决方案,比修改httpd.conf文件要少侵入性。 - Andy Swift
1
在我的服务器上,.htaccess 可以影响所有子目录,可能 Apache 会一直查找任何 .htaccess 直到网站文件夹的根目录。 - nonopolarity
2
是的,这就是.htaccess在所有服务器上的工作方式 - 它也会影响所有子目录。然而,使用.htaccess无法强制Apache生成的目录列表页面转换为UTF-8(据我所知)。 - Mathias Bynens
9
请注意,通过 .htaccess 文件更改服务器范围的设置通常是不良实践。当服务器设置分布在各种文件中时,会使 bug 更难以追踪。还会略微影响性能:对于每个请求的文件,Apache 都需要读取目录的 .htaccess 文件和所有父目录的 .htaccess 文件。因此,.htaccess 应仅用于特定目录设置(例如,防止访问特定目录)或者在绝对无法获取管理员权限时使用。 - Robbert
3
赞成,IndexOptions +Charset=UTF-8 对我很有帮助,谢谢! - mTorres
显示剩余3条评论

31

请参考AddDefaultCharset 指令AddCharset 指令以及这篇文章

AddDefaultCharset utf-8

但我有时需要使用中文字符。以前,我将中文字符转换为Unicode代码,并使用&#方法将其包含在文档中。但这只适用于页面中只有少量字符的情况。

有一个更好的方法:将字符集信息编码到文件名中,Apache将根据此输出正确的编码标头。这得益于conf文件中的AddCharset行,例如下面的一行:

conf/httpd.conf

AddCharset UTF-8 .utf8
所以,如果你有一个文件名以.html.utf8结尾的文件,Apache将按照UTF-8编码来提供页面,并在响应头中包含正确的字符编码指示。

29

在文件.htaccess中,添加此行:

AddCharset utf-8 .html .css .php .txt .js

对于那些没有访问服务器配置文件的人来说,此方法是尝试其他方法失败时可以尝试的一个选择。

就使用文件.htaccess而言,我并未发现性能问题。我的典型页面加载时间为150-200毫秒,无论是否使用文件.htaccess

如果您的页面不能正确呈现,那么性能有什么用?大多数共享服务器不允许用户访问配置文件,而这是添加字符集的首选位置。


1
我无法解释,但只有这个解决方案适用于我。这就是为什么我给它一个大加1的原因。 - Skalár Wag
1
正如@Robbert之前所提到的-如果您还没有使用.htaccess文件,请不要现在开始。这是个坏主意(tm),因为会有性能和管理方面的问题。 - Signal15
当您不包含扩展名时,AddCharset将应用于Content Types text/html和text/plain。 - Misunderstood
这个方法对我有效,而所有上面的答案都没有。+1 - Alator
好的,升级到https://stackoverflow.com/questions/66774524/how-to-specify-no-file-extension-for-apache-htaccess-addcharset。 - Dan Jacobson
显示剩余2条评论

25
在Ubuntu 12.04上,只需取消注释/etc/apache2/conf.d/charset中的AddDefaultCharset UTF-8行即可。如果您使用的是上游Apache,则该文件可能称为httpd.conf,并且您可能需要插入该行。

4
/etc/apache2/conf.d/charset 这个文件不存在。它是由你的发行版创建的自定义包含文件,就像其他不是 httpd.conf 的文件一样。请注意,这里不包括任何解释或额外信息。 - anon
3
在我的系统中(Ubuntu 16.4),它是/etc/apache2/conf-enabled/charset.conf。但这也不起作用。 - Alator
你能否更新你的回答,例如提供Linux发行版信息和版本号。例如,最初使用的是哪个Linux发行版和版本?(但请勿包含“编辑:”,“更新:”或类似内容 - 回答应该看起来像是今天写的。) - Peter Mortensen

12
这还没有经过测试,但很可能能够正常工作。 在你的.htaccess文件中添加:
<Files ~ "\.html?$">  
     Header set Content-Type "text/html; charset=utf-8"
</Files>

然而,这将需要服务器上安装 mod_headers 模块。


1
那对我有用,而选择的解决方案则没有。谢谢!事实上,我甚至不需要将其包装在<Files>标签中。 - Geremia
什么是“mod_headers”?它放在哪里或如何设置? - Peter Mortensen
2
这对我很有用,其他答案都不行。我还发现了一个FilesMatch标签也可以工作。 - njlarsson
我也是。我花了好几个小时,最后找到了这个解决方案。所有的AddDefaultCharset方法都不起作用。我使用的是Apache 2.4.57在FreeBSD 13.3上。 - undefined

12

为了完整性,在Ubuntu上的Apache2中,您可以在conf-available下的charset.conf文件中找到默认字符集。

取消注释该行

AddDefaultCharset UTF-8

"conf-available"是什么?是配置文件中的一个部分吗?还是一个文件?该文件位于哪里? - Peter Mortensen
在Ubuntu 20.04上,该文件位于:/etc/apache2/conf-available/charset.conf。 - gpwr

11

我不确定你是否有访问Apache配置文件(httpd.conf)的权限,但你应该能够设置AddDefaultCharset指令。请参见:

http://httpd.apache.org/docs/2.0/mod/core.html

查找mod_mime.c模块,并确保以下内容已设置:

AddDefaultCharset utf-8 

或等效的Apache 1.x文档(http://httpd.apache.org/docs/1.3/mod/core.html#adddefaultcharset)。

然而,只有当“响应内容类型为text/plain或text/html”时才有效。

您还应确保页面也设置了字符集。有关更多信息,请参见此处:

http://www.w3.org/TR/REC-html40/charset.html


5
如果您有使用UTF-8格式的长文件名,请注意:它们默认会被缩短到20个字节,因此可能会出现最后一个字符被“切断”的情况,使其无法被正确识别。那么您可能需要设置以下内容:IndexOptions Charset=UTF-8 NameWidth=*NameWidth设置可以防止缩短文件名,使它们正确显示和可读。正如其他用户已经提到的,这应该添加在 httpd.confapache2.conf(如果您具有管理员权限)或者 .htaccess (如果没有)。

缩短它们到20个字节?背景是什么? - Peter Mortensen
请问我们是否应该使用加号:IndexOptions +Charset=UTF-8 NameWidth=*。另一个解决方案中有加号。 - Dan Jacobson

3

将其留空即可:'default_charset' in WHM :::::: default_charset =''

P.S.:在WHM中,进入 → 主页服务配置PHP配置编辑器 → 点击 '高级模式' → 查找“default_charset”并将其留空。 什么都不要填写,不是UTF-8也不是ISO。


ISO是什么? ISO 8859-1 - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接