【问题标题】:Creating an XML sitemap with PHP使用 PHP 创建 XML 站点地图
【发布时间】:2011-02-14 10:09:53
【问题描述】:

我正在尝试创建一个会自动更新的站点地图。我用我的 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 声明。最终代码贴在上面。感谢您的帮助!

【问题讨论】:

标签: php xml xml-sitemap


【解决方案1】:

如果您查看生成的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:/
...

该输出中的&lt;?php 表明PHP 代码未被解释


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

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

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


我会添加另一个解决方案:

  • 有一个包含代码的sitemap.php 文件
  • 并且使用 RewriteRule 这样sitemap.xml URL 实际上指向sitemap.php 文件

这样,您将获得sitemap.xml URL,这很好(必需?),但由于代码将在sitemap.php 中,它会被解释。 p>

Apache's mod_rewrite

【讨论】:

  • 好吧,我的服务器上仅有的两个 .xml 文件正在使用 php,所以我没有看到任何危害。做第一个选项是否类似于将其添加到 .htaccess 文件中? AddType application/x-httpd-php .xml
  • 不确定这是否可以在.htaccess 文件中完成(取决于您服务器的配置,可能需要直接在服务器的配置中完成) ; ;但你可以试试,也许它会工作:-)
  • @iMaster:要使您的代码正常工作,还必须关闭 short_tags(默认情况下它是关闭的——只是需要注意的一点)。此外,当我目前访问designdeluge.com/sitemap.xml 时,我收到了 HTTP 500 响应,因此您的配置已损坏(可能是因为您现在正在处理它)。最后,对于大型网站,实时生成整个站点地图可能是不可行的 - 因此,如果您希望增长到数千页或更多页面,请准备好稍后重新实现。
  • 我不确定是什么导致了 500 错误...我添加到我的 .htaccess 文件中的只是两个重写规则,但我认为这不是导致它的原因。我添加了这个: RewriteRule ^rss\.xml$ rss.php RewriteRule ^sitemap\.xml$ sitemap.php [L] 不知道为什么会导致错误...有什么方法可以获取有关导致错误的原因的更多信息像那样?
  • 这里是 .htaccess 文件的 gud 示例pingbin.com/2011/03/sitemap-php-to-sitemap-xml-htaccess-file
【解决方案2】:

最简单的解决方案是在您的 apache .htaccess 文件中添加 RewriteEngine On 之后的以下行

RewriteRule ^sitemap\.xml$ sitemap.php [L]

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

文件sitemap.php应以

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

【讨论】:

    【解决方案3】:

    我使用了 William 的代码(谢谢),并进行了一些小的修改,它对我有用。

    我认为行:

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

    应该是顶部&lt;?php之后的第二行

    顺便说一句,对复制它的其他人来说只是一个小点,但在第一行的 &lt;?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>
    

    【讨论】:

      【解决方案4】:

      这是创建和更新sitemap.xml 文件的最简单方法。

      $actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
      
      require_once('database.php');
      
      $sitemapText = '<?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>http://ajkhub.com/</loc>
            <lastmod>2021-08-18T18:32:09+00:00</lastmod>
            <priority>1.00</priority>
          </url>
          <url>
            <loc>http://ajkhub.com/includes/about.php</loc>
            <lastmod>2021-08-18T18:32:09+00:00</lastmod>
            <priority>0.80</priority>
          </url>
          <url>
            <loc>http://ajkhub.com/includes/privacy-policy.php</loc>
            <lastmod>2021-08-18T18:32:09+00:00</lastmod>
            <priority>0.80</priority>
          </url>
          <url>
            <loc>http://ajkhub.com/includes/termsandcondition.php</loc>
            <lastmod>2021-08-18T18:32:09+00:00</lastmod>
            <priority>0.80</priority>
          </url>';
      
      $sql = "SELECT * FROM page ORDER BY id DESC LIMIT 4";
      $result = mysqli_query($conn, $sql);
      if (mysqli_num_rows($result) > 0) {
         while($row = mysqli_fetch_assoc($result)) {
      $sitemapText .= ' <url>
                       <loc>'.$actual_link."/".$row['page'].'</loc>
                       <lastmod>'.date(DATE_ATOM,time()).'</lastmod>
                       <priority>0.80</priority>
                     </url>';
         }
      }
      
      $sitemapText .= '</urlset>';
      
      $sitemap = fopen("sitemap.xml", "w") or die("Unable to open file!");
      
      fwrite($sitemap, $sitemapText);
      fclose($sitemap);
      

      【讨论】:

        猜你喜欢
        • 2011-03-03
        • 2017-01-05
        • 2011-08-06
        • 2023-01-09
        • 1970-01-01
        • 2019-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多