11

我有一个.htaccess看起来像这样的文件:

AddDefaultCharset utf-8
AddCharset utf-8 .html
Order Allow,Deny 
ErrorDocument 403 "Error 403 - Esta ubicación no es pública"

文件本身被编码为 UTF-8。但是,Apache 坚持声明 ISO-8859-1 并且错误消息被破坏:

HTTP/1.1 403 Forbidden
Date: Fri, 29 Nov 2013 10:06:25 GMT
Server: Apache/2.4.6 (Win32) OpenSSL/1.0.1e PHP/5.5.6
Content-Length: 42
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1

如果我在浏览器中手动将编码更改为 UTF-8,则看起来是正确的。

网站已被授予所有权限:

<VirtualHost *:80>
    ServerName tmp
    DocumentRoot "D:/tmp"

    <Directory "D:/tmp">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

...而且 Apache 日志中没有任何相关内容。

我错过了什么?

4

1 回答 1

10

好棒的问题!!我必须说。我必须挖掘所有资源并阅读大量手册才能找到这种行为的原因。

这似乎是一种已知的行为,但在官方手册中并没有很好地涵盖。最后,我在以下位置找到了它的一个参考this Apache manual

抑制错误字符集

在 2.0.54 之后的版本中可用

当 Apache 发出重定向以响应客户端请求时,响应包含一些实际文本,以防客户端无法(或不)自动遵循重定向。Apache 通常根据其使用的字符集(即 ISO-8859-1)标记此文本。

但是,如果重定向到使用不同字符集的页面,一些损坏的浏览器版本将尝试使用重定向文本中的字符集,而不是实际页面。例如,这可能导致希腊语被错误地呈现。

设置此环境变量会导致 Apache 忽略重定向文本的字符集,然后这些损坏的浏览器将正确使用目标页面的字符集。

这正是您charset=iso-8859-1在标题中看到的行为。


怎么修:

有这样的 .htaccess 代码:

# set desired env variable to suppress iso-8859-1 charset
SetEnvIf Host ^ suppress-error-charset

# set desired 403 message with desired charset 
ErrorDocument 403 "<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'></head><body>Error 403 - Esta ubicación no es pública</body></html>"

请注意,这SetEnvIf Host ^是一个始终成立的条件,因此suppress-error-charset将始终设置。我只用我的那两行进行了测试,.htaccess并在我的浏览器中显示了正确的错误消息。

于 2013-11-30T07:17:03.730 回答