2010-04-30 88 views
14

我正在嘗試創建一個會自動更新的站點地圖。我已經做了一些類似於我的RSS提要,但是這個站點地圖拒絕工作。你可以在http://designdeluge.com/sitemap.xml上查看它。我認爲主要的問題是它不識別PHP代碼。下面是完整的源:用PHP創建XML站點地圖

<?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的(例如,從DB拉的那些)沒有被生成網站地圖不會驗證。謝謝!

編輯:現在,我只是想讓代碼本身工作。我已將它設置爲本地測試服務器上的PHP文件。上面的代碼正在被使用。現在,沒有任何東西在屏幕上或源文件中顯示。我在想我犯了一個語法錯誤,但我找不到任何東西。任何和所有的幫助表示讚賞!

編輯2:好的,我把它整理出來了。顯然,我不得不用PHP迴應XML聲明。最終的代碼在上面發佈。謝謝你的幫助!

回答

27

如果你看看系統產生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代碼不解釋爲


這可能是因爲您的Web服務器不承認.xml作爲應該包含PHP代碼文件的擴展名。

至少有兩種可能的解決方案:

  • 重新配置您的服務器,因此XML文件經過PHP解釋(可能不是一個好主意:這可能會導致現有文件的問題)
  • 例如,將您的站點地圖的擴展名更改爲sitemap.php,以便它被服務器解釋。


我想補充另一種解決方案:

  • 有一個sitemap.php文件,包含代碼
  • 使用重寫規則所以sitemap.xml URL實際上指向sitemap.php文件

因此,您將擁有sitemap.xml網址,不錯(必填? ),但因爲代碼將在sitemap.php,它會被解釋。

請參閱Apache's mod_rewrite

+0

那麼我的服務器上僅有的兩個.xml文件正在使用PHP的,所以我看不出有任何的傷害。會做第一個選項是像添加到一個.htaccess文件? AddType應用程序/ x-httpd-php .xml – williamg 2010-04-30 21:36:47

+2

不確定這可以在'.htaccess'文件中完成*(取決於服務器的配置,可能需要直接在服務器配置中執行)* ;;但你可以嘗試,也許它會工作:-) – 2010-04-30 21:40:40

+0

@iMaster:爲了你的代碼工作,short_tags也必須關閉(它是默認的 - 只是要注意的東西)。此外,當我訪問http://designdeluge.com/sitemap.xml時,我得到一個HTTP 500響應,所以你的配置被破壞了(可能是因爲你正在處理它)。最後,對於大型網站,實時生成整個站點地圖可能不可行 - 因此,如果您希望增長到數千頁或更多,請準備稍後重新實施。 – 2010-04-30 21:42:54

3

我已經使用了William的代碼(謝謝)以及它爲我工作的一些小修改。

我覺得行:

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> 
3

最好的解決辦法是添加到您的Apache .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"?>' ?> 

工程:)