我正在尝试创建一个会自动更新的站点地图。我做了类似于我的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声明。最终代码发布在上面。谢谢你的帮助!
答案 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代码的文件的扩展名。
至少有两种可能的解决方案:
sitemap.php
,以便服务器对其进行解释。
我想补充一点:
sitemap.php
文件,其中包含代码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
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>
它有效:)