PHP抛出XML开始标记错误



我有一个文件,其中包括一个名为sitemap.html的文件,在站点地图中,我有以下代码:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
    <url>
        <loc><?php echo SITE_URL . '/'; ?></loc>
        <changefreq>monthly</changefreq>
        <priority>1.00</priority>
    </url>
    <?php foreach ($this->data->content as $content): ?>
        <url>
            <loc><?php echo SITE_URL . $content->permalink; ?></loc>
            <lastmod><?php echo date("Y-m-d", $content->publish_date); ?></lastmod>
            <changefreq>monthly</changefreq>
            <priority><?php echo $content->sitemap_index; ?></priority>
        </url>
    <?php endforeach; ?>
</urlset>

一切似乎都很好,但我得到一个错误500,说:

PHP解析错误:语法错误,意外的'version' (T_STRING)在sitemap.html第1行

正如你所看到的,我使用<?xml而不是<?php,所以为什么它试图解析它为PHP?

起初,我认为这是引起问题的魔术引号,但是当我做get_magic_quotes_gpc()的var_dump时,我得到bool(false),所以魔术引号甚至没有打开。

同样,在我的php.ini中,我看到magic_quotesOFF

作为修复它的替代方法,我将第一行替换为以下内容:

<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>

但我还是很好奇发生了什么。

我有其他网站托管在同一台服务器上(PHP版本5.4.45),我没有得到其他网站的站点地图上的PHP解析错误…

你知道是什么导致了这个错误吗?

您应该检查short_open_tag选项。我看到它的方式,PHP看到<?你的<?xml的一部分作为PHP打开标签,并产生一个错误。

如果您要用PHP处理HTML页面,并且它在其他所有站点上都能工作,那么您(显然)正在处理一个难以排除故障的配置问题。

您可以继续搜索隐藏在服务器某处的short_open_tags设置,或者您可以简单地使用PHP回显XML声明。

<?php echo '<?xml version="1.0" encoding="UTF-8" ?>' ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
    <url>
        <loc><?php echo SITE_URL . '/'; ?></loc>
        <changefreq>monthly</changefreq>
        <priority>1.00</priority>
    </url>
    <?php foreach ($this->data->content as $content): ?>
        <url>
            <loc><?php echo SITE_URL . $content->permalink; ?></loc>
            <lastmod><?php echo date("Y-m-d", $content->publish_date); ?></lastmod>
            <changefreq>monthly</changefreq>
            <priority><?php echo $content->sitemap_index; ?></priority>
        </url>
    <?php endforeach; ?>
</urlset>

这是关于这个主题的旧页面:PHP开始标签和XML声明

我更喜欢给所有的PHP代码文件。PHP扩展名,所以它是非常清楚的,他们包含的代码,而不是导致PHP处理每个HTML文件的开销,但这只是我的意见。

如前所述,这是由于short_open_tag选项

告诉PHP是否允许PHP打开标记的简短形式(<? ?>)。如果您想将PHP与XML结合使用,您可以禁用此选项以使用<?xml ?> inline。否则,您可以使用PHP打印它,例如:<?php echo '<?xml version="1.0"?>'; ?>。此外,如果禁用,则必须使用PHP打开标记的长格式(<?php ?>)。

相关内容

  • 没有找到相关文章