Header 中的 HTTP 内容类型

HTTP Content Type in Header

我有旧的 Web 应用程序在 php 中生成 XML 个文件。此 XML 由 XMLHttpRequest object (AJAX) 请求。一切正常。但是今天有一些服务器升级和网络应用程序出现了一点故障。

问题是代码中有与 XMLHttpRequests 相关的检查。 1) 如果我有一个 response 比我根据它的内容类型正确解析它。

var contentType = xhr.getResponseHeader("Content-Type"); 
        //build the json object if the response has one
        if(contentType == "application/json") { 
            response = JSON.parse(xhr.responseText); 
        }
        //get the dom element if the response is XML
        else if(contentType == "text/xml") { 
            response = xhr.responseXML; 
        } else { //by default get the response as text
            response = xhr.responseText; 
        }

这是导致服​​务器现在的问题 returns:

text/xml;charset=UTF-8

而不是

text/xml

好的,我只需更改这一行,错误就会消失。但我想知道为什么服务器升级(bluehost)会对此产生影响。

这是PHP/MySQL环境。

两者都是有效的内容类型。内容类型可以由网络服务器软件(例如 Apache)或脚本(PHP)设置。我假设它是 PHP 因为你问题上的标签。

如果您控制服务器上的脚本并希望指定内容类型,可以在 PHP 内轻松完成,只需添加以下行:

header('Content-Type: text/xml');

这必须在从脚本发送任何其他输出之前发生,因为 headers 出现在 http 响应中的内容之前。如果 header 未在 PHP 脚本中设置,则 Web 服务器将选择一个。

如果您不控制生成 XML 的脚本或服务器,那么您只需要接受系统升级很常见的事实,这可能会影响您自己的应用程序。

补充一下 Steve E 的回答,"charset=UTF-8" 部分指定了一个字符集。

对于 unicode(UTF-8 是 unicode 的一种实现)和字符集,没有比 Joel on Software 上的更好的解释了,here(顺便说一句,Joel 还创建了 Stack Overflow)。简而言之,字符集定义了可在文本中使用的字符集。 Unicode 是一种字符集,支持几乎所有国际语言。 UTF-8 指定 Unicode 字符集如何以字节为单位实现(因此对于 UTF-8,Unicode 字符占用 1 - 4 个字节)。当您看到乱码文本(例如 ?s 而不是字符)时,这通常是因为未以正确的字符编码解释文档。

实际上最好的做法是将编码包含在 content-type header 中,因此我将其保留为 "text/xml;charset=UTF-8"。 Bluehost 可能更新了导致更改的默认设置(即他们为 xml 文档显示的默认 content-type)。顺便说一句,术语字符集和编码有时可以互换使用,但是当您指定 "charset=UTF-8" 时,您更正确地指定了 encoding (UTF-8 是编码, Unicode是字符集)。