使用PHP创建XML站点地图

时间:2010-04-30 21:27:09

标签: php xml sitemap

我正在尝试创建一个会自动更新的站点地图。我做了类似于我的RSS提要的事情,但这个网站地图拒绝工作。您可以在http://designdeluge.com/sitemap.xml实时查看它。我认为主要问题是它无法识别PHP代码。这是完整的来源:

 <?php 


include 'includes/connection.php';

header("Content-type: text/xml");

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

?>

<urlset xmlns="http://www.google.com/schemas/sitemap/0.84" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84 http://www.google.com/schemas/sitemap/0.84/sitemap.xsd">

    <url>
        <loc>http://designdeluge.com/</loc>
        <lastmod>2010-04-20</lastmod>
        <changefreq>weekly</changefreq>
        <priority>1.00</priority>
    </url>

    <url>
        <loc>http://designdeluge.com/about.php</loc>
        <lastmod>2010-04-20</lastmod>
        <changefreq>never</changefreq>
        <priority>0.5</priority>
    </url>

    <?php

    $entries = mysql_query("SELECT * FROM Entries");

    while($row = mysql_fetch_assoc($entries)) {
    $title = stripslashes($row['title']);
    $date = date("Y-m-d", strtotime($row['timestamp']));

    echo "

    <url>
        <loc>http://designdeluge.com/".$title."</loc>
        <lastmod>".$date."</lastmod>
        <changefreq>never</changefreq>
        <priority>0.8</priority>
    </url>";

 } ?>

</urlset>

问题在于没有生成动态URL(例如从数据库中提取的URL),并且站点地图不会验证。谢谢!

编辑:现在,我只是想让代码本身正常运行。我把它设置为我本地测试服务器上的PHP文件。上面的代码正在使用中。现在,屏幕上或源中没有显示任何内容。我想我的语法错误,但我找不到任何东西。任何和所有的帮助表示赞赏!

编辑2:好的,我把它整理好了。显然,我不得不用PHP回应xml声明。最终代码发布在上面。谢谢你的帮助!

3 个答案:

答案 0 :(得分:31)

如果您查看已生成sitemap.xml(使用查看源,例如在浏览器中),您会看到:

<?php header('Content-type: text/xml'); ?>
<?xml version="1.0" encoding="UTF-8" ?>
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84" xmlns:xsi="http:/
...

该输出中显示的<?php表示 PHP代码未被解释


这可能是因为您的网络服务器无法将.xml识别为应包含PHP代码的文件的扩展名。

至少有两种可能的解决方案:

  • 重新配置您的服务器,因此XML文件通过PHP解释器(可能不是一个好主意:这可能会导致现有文件出现问题!)
  • 例如,将站点地图的扩展名更改为sitemap.php,以便服务器对其进行解释。


我想补充一点:

  • 拥有一个sitemap.php文件,其中包含代码
  • 使用RewriteRule ,以便sitemap.xml网址实际指向sitemap.php文件

有了这个,您将拥有sitemap.xml网址,这是很好的(必需?),但由于代码位于sitemap.php,它会获得解释

请参阅 Apache's mod_rewrite

答案 1 :(得分:5)

我已经使用了威廉的代码(谢谢),并通过一些小的修改,它对我有用。

我认为这一行:

header("Content-type: text/xml");

应该是顶部<?php

之后的第二行

顺便说一句,对于复制它的其他任何人来说只是一个小点,但在第一行的<?php之前有一个空格字符 - 如果你像我一样无意中复制它,你会花一点钱时间试图弄清楚为什么代码不会为你工作!

我不得不稍微调整一下MySql select语句。

最后,在输出中,我使用了一个变量$ domain,这样这段代码就可以用作模板,而不需要考虑它(前提是你每次都使用相同的表名)。变量被添加到connectdb.php文件中,该文件包含在连接数据库中。

这是威廉代码的工作版本:

<?php 
header("Content-type: text/xml");
echo '<?xml version="1.0" encoding="UTF-8" ?>';
include 'includes/connectdb.php';
?>

<urlset xmlns="http://www.google.com/schemas/sitemap/0.84" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84 http://www.google.com/schemas/sitemap/0.84/sitemap.xsd">

    <url>
        <loc>http://www.DOMAIN.co.uk/</loc>
        <priority>1.00</priority>
    </url>

    <?php

    $sql = "SELECT * FROM pages WHERE onshow = 1 ORDER BY id ASC";
    $result = mysql_query($sql,$conn);      
    while($row = mysql_fetch_array($result))
    { 
    $filename = stripslashes($row['filename']);
    ?>
    <url>
        <loc>http://www.<?php echo "$domain"; ?>/<?php echo "$filename" ?></loc>
        <changefreq>monthly</changefreq>
        <priority>0.5</priority>
    </url>

 <?php } ?>

</urlset>

答案 2 :(得分:3)

最佳解决方案是在.htaccess

之后将以下行添加到您的apache RewriteEngine On文件中
RewriteRule ^sitemap\.xml$ sitemap.php [L]

然后只需在根文件夹中有一个文件sitemap.php,该文件通常可以通过http://yoursite.com/sitemap.xml访问,sitemap.php是所有搜索引擎首先搜索的默认网址。

文件<?php header('Content-type: application/xml; charset=utf-8') ?> <?php echo '<?xml version="1.0" encoding="UTF-8"?>' ?> 应以

开头
<blockquote> ... </blockquote>

它有效:)