标头中的HTTP内容类型


HTTP Content Type in Header

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

问题是代码中存在与XMLHttpRequest相关的检查。1) 如果我有一个响应,我会根据它的内容类型正确地解析它。

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; 
        }

这是服务器现在返回的问题原因:

text/xml;charset=UTF-8

而不是

text/xml

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

这是PHP/MMySQL环境。

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

如果您控制服务器上的脚本并希望指定内容类型,那么在PHP中添加以下行很容易做到:

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

这必须在从脚本发送任何其他输出之前发生,因为标头出现在http响应中的内容之前。如果没有在PHP脚本中设置头,那么web服务器将选择一个。

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

为了增加Steve E的答案,"charset=UTF-8"部分指定了一个字符集。

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

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