我正在使用PHP的DOMDocument功能从远程源检索XML文档(在本例中为RSS feed)。它将XML作为DOM对象返回,我可以像这样访问XML标记的内容:
$url = $_POST['url']; // eg. http://example.com/page.xml
$xmlDoc = new DOMDocument();
$xmlDoc -> load($url);
$channel = $xmlDoc -> getElementsByTagName('channel') -> item(0);
这对我来说很好用,但是我想知道是否有一种方法可以检查提供文档的服务器是否发送了正确的content-type
标头,在这种情况下应为text/xml
或application/xml
。如何确定要发送的内容类型标头?
我想我要做的事情是距离确定文档是否为有效XML更近一步。我知道查看内容类型标头并不能保证这一点,但是如果发送错误的标头,我可能会排除一些错误。
答案 0 :(得分:2)
这是PHP进行某些自动行为的领域之一,如果没有多年的经验,很难发现这些行为。在URL上调用DOMDocument::load()
会调用PHP的http / https流包装器来加载URL。这样做会根据前一个http / https流调用的内容填充special variable called $http_response_header
来表示标头数组。
因此,在$xmlDoc->load($url)
之后,尝试检查$http_response_header
。请注意,它不是一个易于解析的关联数组。相反,您需要找到Content-Type:
字符串并将其在冒号:
上分割。
$xmlDoc = new DOMDocument();
$xmlDoc->load($url);
// Loop over the array and look for the desired header
foreach ($http_response_header as $header) {
// Find the header with a case-insensitive search
// for Content-Type:
if (stripos($header, 'Content-Type:') === 0) {
// and split it on : to take the second value
// Example: "Content-Type: application/xml; charset=UTF-8"
$content_type = trim(explode(':', $header)[1]);
}
// You can break out of the loop after finding it
break;
}
警告-如果您接受$_POST
格式的URL,则可能希望对可接受的值设置一些限制。您可能会通过检索任意URL暴露出一些安全问题(会引起拒绝服务攻击,也可能是代理滥用)
// Careful not to accept just any url anyone sends...
$url = $_POST['url'];