【问题标题】:Set charset in ErrorDocument messages在 ErrorDocument 消息中设置字符集
【发布时间】:2013-12-15 12:07:23
【问题描述】:

我有一个如下所示的.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 日志中没有任何相关内容。

我错过了什么?

【问题讨论】:

    标签: apache .htaccess utf-8 apache2.4


    【解决方案1】:

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

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

    抑制错误字符集

    在 2.0.54 之后的版本中可用

    当 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 中仅使用这两行进行了测试,并在我的浏览器中显示了正确的错误消息。

    【讨论】:

    • 设置suppress-error-charset 使Apache 省略Content-Type 中的charset 参数(这绝对比发送不正确的参数要好)。我想没有办法发送正确的,但使用元标记(或依赖于浏览器的自动检测)似乎是一种合理的解决方法。不错的答案:)
    • 没错,这个特殊的东西在我看来是一个错误而不是一个功能。怎么能盲目地执行ISO-8859-1?后来有人意识到这一点并引入了suppress-error-charset 来完全禁止字符编码。更好的解决方法是允许在这个 env 变量中使用任何字符编码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2019-02-14
    相关资源
    最近更新 更多