Создание XML-карты сайта с PHP
Я пытаюсь создать файл Sitemap, который будет автоматически обновляться. Я сделал что-то похожее на мой RSS-канал, но этот файл Sitemap отказывается работать. Вы можете просмотреть его в прямом эфире 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 (например, те, что вытащил из БД) не генерируются и карта сайта не будет проверяться. Спасибо!
EDIT:. Сейчас я просто пытаюсь заставить сам код работать. Я настроил его как файл PHP на моем локальном сервере тестирования. Используется код выше. Сейчас ничего не отображается ни на экране, ни в источнике. Я думаю, что я сделал синтаксическую ошибку, но ничего не могу найти. Любая помощь приветствуется!
РЕДАКТИРОВАТЬ 2: Хорошо, я разобрался с парнями. По-видимому, мне пришлось отменить XML-объявление с помощью PHP. Окончательный код размещен выше. Спасибо за вашу помощь!
Ответы
Ответ 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:/
...
<?php
, присутствующий в этом выпуске, показывает, что PHP-код не интерпретируется.
Вероятно, это связано с тем, что ваш веб-сервер не распознает .xml
как расширение файлов, содержащих PHP-код.
Как минимум два возможных решения:
- Переконфигурируйте свой сервер, поэтому XML файлы проходят через интерпретатор PHP (может быть, не такая хорошая идея: это может вызвать проблемы с существующими файлами!)
- Измените расширение вашей карты сайта, например, на
sitemap.php
, поэтому оно интерпретируется вашим сервером.
Я бы добавил еще одно решение:
- Имеет файл
sitemap.php
, содержащий код
- И используйте RewriteRule, поэтому URL
sitemap.xml
фактически указывает на файл sitemap.php
При этом у вас будет URL sitemap.xml
, который является хорошим (обязательно?), но поскольку код будет в sitemap.php
, он будет интерпретироваться.
См. Apache mod_rewrite
.
Ответ 2
Я использовал код William (спасибо) и несколько небольших модификаций, которые он работал у меня.
Я думаю, что строка:
header("Content-type: text/xml");
должна быть вторая строка после верхнего <?php
Кстати, всего лишь небольшая точка для всех, кто ее копирует, но перед <?php
в первой строке есть один пробел, если вы невольно копируете его, как я, вы потратите немного времени, пытаясь выяснить, почему код не будет работать для вас!
Мне также пришлось немного подбирать инструкцию выбора MySql.
Наконец, на выходе я использовал переменную $domain, чтобы этот фрагмент кода можно использовать в качестве шаблона без необходимости думать об этом (при условии, что вы используете одно и то же имя таблицы каждый раз). Variabe добавляется в файл 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
, URL-адрес по умолчанию, в который будут сначала искать все поисковые системы.
Файл sitemap.php
начинается с
<?php header('Content-type: application/xml; charset=utf-8') ?>
<?php echo '<?xml version="1.0" encoding="UTF-8"?>' ?>
он работает:)