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是字符集)。
我有旧的 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是字符集)。