标头中的HTTP内容类型

时间:2016-01-12 20:51:54

标签: php http http-headers xmlhttprequest

我有一个旧的Web应用程序,可以在php中生成XML文件。 XMLHttpRequest对象(AJAX)请求此XML。一切正常。但今天有一些服务器升级和Web应用程序崩溃了一点。

问题是代码中存在与XMLHttpRequests相关的检查。 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 / MySQL环境。

2 个答案:

答案 0 :(得分:1)

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

如果您控制服务器上的脚本并想要指定内容类型,则可以通过添加以下行来在PHP中轻松完成:

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

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

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

答案 1 :(得分:1)

只是为了补充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而不是字符)时,通常是因为文档没有以正确的字符编码进行解释。

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