7

我有一个文件,其中包含一个名为的文件,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 解析错误:语法错误,第 1 行的 sitemap.html 中出现意外的“版本”(T_STRING)

如您所见,我正在使用<?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 解析错误...

知道可能导致此错误的原因是什么吗?

4

3 回答 3

7

你应该检查short_open_tag选项。在我看来,PHP 将<?您的一部分<?xml视为 php 打开标记并生成错误。

于 2016-10-13T19:16:41.023 回答
3

如果您要让 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 opening tags and XML declaration

我更喜欢为所有 PHP 代码文件提供 .php 扩展名,因此非常清楚它们包含代码并且不会产生让 PHP 处理每个 HTML 文件的开销,但这只是我的意见。

于 2016-11-03T17:31:43.963 回答
1

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

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

于 2016-10-13T19:22:37.627 回答