Htaccess xml to php

Создание карты сайта sitemap.xml на php

Создание карты сайта sitemap.xml на php

Sitemap — это файл со ссылками на страницы сайта, который сообщает поисковым системам об актуальной структуре сайта.

Основные поддерживаемые форматы поисковыми системами

Формат протокола Sitemap состоит из XML-тегов. Для всех значений данных в файле Sitemap должно использоваться маскирование . В файле необходимо использовать кодировку UTF-8.

Sitemap должен:

  • В начале поставьте открывающий тег < urlset > , а в конце поставьте закрывающий тег .
  • Укажите область имен (стандарт протокола) в теге .
  • Включите запись < url > для каждого URL-адреса как родительский тег XML.
  • Включите дочернюю запись < loc > для каждого родительского тега .

Пример XML-файла Sitemap

Ниже приведен пример файла Sitemap, в котором содержится только один URL-адрес и использованы все необязательные теги. Необязательные теги выделены курсивом.

  urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> url> loc>http://www.example.com/ lastmod>2005-01-01 changefreq>monthly priority>0.8    

Инкапсулирует этот файл и указывает стандарт текущего протокола.

Родительский тег для каждой записи URL-адреса. Остальные теги являются дочерними для этого тега.

URL-адрес страницы. Этот URL-адрес должен начинаться с префикса (например, HTTP) и заканчиваться косой чертой, если Ваш веб-сервер требует этого. Длина этого значения не должна превышать 2048 символов.

Дата последнего изменения файла. Эта дата должна быть в формате W3C Datetime . Этот формат позволяет при необходимости опустить сегмент времени и использовать формат ГГГГ-ММ-ДД.

Обратите внимание, что этот тег не имеет отношения к заголовку «If-Modified-Since (304)», который может вернуть сервер, поэтому поисковые системы могут по-разному использовать информацию из этих двух источников.

Вероятная частота изменения этой страницы. Это значение предоставляет общую информацию для поисковых систем и может не соответствовать точно частоте сканирования этой страницы. Допустимые значения:

Значение»всегда» должно использоваться для описания документов, которые изменяются при каждом доступе к этим документам. Значение «никогда» должно использоваться для описания архивных URL-адресов.

Имейте в виду, что значение для этого тега рассматривается как подсказка , а не как команда. Несмотря на то, что сканеры поисковой системы учитывают эту информацию при принятии решений, они могут сканировать страницы с пометкой «ежечасно» менее часто, чем указано, а страницы с пометкой «ежегодно» – более часто, чем указано. Сканеры могут периодически сканировать страницы с пометкой «никогда», чтобы отслеживать неожиданные изменения на этих страницах.

Приоритетность URL относительно других URL на Вашем сайте. Допустимый диапазон значений — от 0,0 до 1,0. Это значение не влияет на процедуру сравнения Ваших страниц со страницами на других сайтах — оно только позволяет указать поисковым системам, какие страницы, по Вашему мнению, более важны для сканеров.

Приоритет страницы по умолчанию — 0,5.

Следует учитывать, что приоритет, который Вы назначили странице, не влияет на положение Ваших URL на страницах результатов той или иной поисковой системы. Поисковые системы используют эту информацию при обработке URL, которые относятся к одному и тому же сайту, поэтому можно использовать этот тег для увеличения вероятности присутствия в поисковом индексе Ваших самых важных страниц.

Кроме того, следует учитывать, что назначение высокого приоритета всем URL на Вашем сайте не имеет смысла. Поскольку приоритетность – величина относительная, этот параметр используется для того, чтобы определить очередность обработки URL в пределах сайта.

Маскирование символов
Символ Маскирование
Амперсанд & &
Одинарные кавычки '
Двойные кавычки « "
Больше > >
Меньше <

Пример таблицы с постами

Рассмотрит простую таблицу с постами в которой есть параметры дня нашего Sitemap.

База постов

Теперь на основании данной таблицы построим sitemap.xml

Пишем скрипт на php для генерации sitemap.xml

Для генерации sitemap.xml с помощью php убедитесь, что у вас включено расширение xmlwriter

XMLWriter является модулем PHP. Он создаёт xmlWriter API на основе библиотеки libxml.

Модуль представляет собой класс-писатель, который является некэшируемым, однонаправленным средством генерирования потоков или файлов, содержащих данные XML.

Модуль может быть использован в объектно-ориентированном либо в процедурном стилях. Каждый документированный метод описывает альтернативные процедурные вызовы.

 prepare($sql); $sth->execute(); $posts = $sth->fetchAll(PDO::FETCH_OBJ); //Включаем буферизацию вывода ob_start(); /** * Создаем объект XMLWriter() * Убедитесь что у вас включено соответствующее расширение для PHP * */ $writer = new \XMLWriter(); $writer->openURI('php://output'); $writer->startDocument('1.0', 'UTF-8'); $writer->startElement('urlset'); $writer->writeAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9'); foreach($posts as $items)< $writer->startElement('url'); $writer->writeElement('loc',htmlspecialchars(HOST . $items->alias)); $writer->writeElement('lastmod', $items->date); $writer->writeElement('changefreq', $items->changefreq); $writer->writeElement('priority', $items->priority); $writer->endElement(); > $writer->endElement(); $writer->endDocument(); //Очищаем буфер, отдаем содержимое echo ob_get_clean(); ?> 

Создаем правило .htaccess для перенаправления с sitemap.php на sitemap.xml

Внимание:

Если данный скрипт лежит у вас в корне сайта с именем sitemap.php, вы хотите чтобы он открывался по адресу https://example.com/sitemap.xml. В файле .htaccess нужно добавить запись:

 RewriteEngine On RewriteRule ^sitemap.xml$ sitemap.php [L,QSA] 

Добавляем директиву Sitemap в robots.txt

Чтобы поисковые системы знали где расположен файл карты сайта нужно добавить директиву Sitemap в robots.txt:

 User-agent: * Sitemap: https://example.com/sitemap.xml 

Источник

htaccess sitemap.xml rewrite to /sitemaps/$_SERVER[«MYVAR»]/sitemap.xml

I am trying to update htaccess to write as following: htaccess sitemap.xml rewrite to /sitemaps/$_SERVER[«MYVAR»]/sitemap.xml This rewrite should only occur if sitemap.xml is requested in root (otherwise the above would loop) I came up with this

RewriteCond % !^/sitemap.xml RewriteRule .* /sitemaps/$_SERVER["MYVAR"]/sitemap.xml [L,NC] 

But this is not working, server error. Anyone know how to do this? And on a side note: rewrite to /sitemaps/domain/sitemap.xml would be fine too (where domain is captured from the request host either www.domain.com or domain.com )

1 Answer 1

You can’t use a PHP superglobal eg. $_SERVER[«MYVAR»] in an htaccess expression. (Apache .htaccess files are processed before PHP gets a go, but anyway $_SERVER[«MYVAR»] is PHP syntax not Apache mod_rewrite syntax). However, depending on what MYVAR contains, there might be an alternative.

This rewrite should only occur if sitemap.xml is requested

Your current RewriteCond directive actually does the complete opposite and results in a rewrite when «sitemap.xml» is not requested. The ! prefix negates the regex.

rewrite to /sitemaps/domain/sitemap.xml would be fine too (where domain is captured from the request host either www.domain.com or domain.com )

This is possible, something like the following:

RewriteCond %(HTTP_HOST) (www\.)?([a-z0-9-]+)\.com RewriteRule ^sitemap\.xml /sitemaps/%2/sitemap.xml [L,NC] 

Where %2 is the 2nd parenthesised sub pattern in the RewriteCond directive. However, before this you should already have your canonical www or non-www redirect, so you should already know whether HTTP_HOST contains the www subdomain or not — this will simplify your RewriteCond pattern.

Источник

Формирование файла sitemap.xml

Предполагается что в таблице стаей есть даты публикации и последнего изменения
( `date_add` и `date_edit` ).

// Подключение к БД. $dbh = new PDO('mysql:dbname=db_name;host=localhost', 'ЛОГИН', 'ПАРОЛЬ'); $out = ''; // Получение статей из БД. $sth = $dbh->prepare("SELECT * FROM `articles`"); $sth->execute(); $articles = $sth->fetchAll(PDO::FETCH_ASSOC); foreach ($articles as $row) < // Дата изменения статьи. $date = max(array($row['date_add'], $row['date_edit'])); $out .= ' https://example.com/articles/' . $row['id'] . '.html ' . date('Y-m-d', $date) . ' ' . ((($date + 604800) > time()) ? '1' : '0.5') . ' '; > $out .= ''; header('Content-Type: text/xml; charset=utf-8'); echo $out; exit();

Вариант на DOMDocument

// Подключение к БД. $dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль'); $dom = new DOMDocument('1.0', 'utf-8'); $urlset = $dom->createElement('urlset'); $urlset->setAttribute('xmlns','http://www.sitemaps.org/schemas/sitemap/0.9'); // Получение статей из БД. $sth = $dbh->prepare("SELECT * FROM `articles`"); $sth->execute(); $articles = $sth->fetchAll(PDO::FETCH_ASSOC); foreach($articles as $row) < // Дата изменения статьи. $date = max(array($row['date_add'], $row['date_edit'])); $url = $dom->createElement('url'); // Элемент - URL статьи. $loc = $dom->createElement('loc'); $text = $dom->createTextNode( htmlentities('https://example.com/articles/' . $row['id'] . '.html', ENT_QUOTES) ); $loc->appendChild($text); $url->appendChild($loc); // Элемент - дата последнего изменения статьи. $lastmod = $dom->createElement('lastmod'); $text = $dom->createTextNode(date('Y-m-d', $date)); $lastmod->appendChild($text); $url->appendChild($lastmod); // Элемент - приоритетность (от 0 до 1.0, по умолчанию 0.5). // Если дата публикации/изменения статьи была меньше недели назад ставим приоритет 1. $priority = $dom->createElement('priority'); $text = $dom->createTextNode((($date + 604800) > time()) ? '1' : '0.5'); $priority->appendChild($text); $url->appendChild($priority); $urlset->appendChild($url); > $dom->appendChild($urlset); // Сохранение в файл. $dom->save(__DIR__ . '/sitemap.xml'); // Или отправка в браузер. header('Content-Type: text/xml'); echo $dom->saveXML(); exit();

Результат:

   https://example.com/articles/16.html 2016-11-19 1  https://example.com/articles/3.html 2016-11-08 0.5  

Перенаправление с .php на .xml

Например данный скрипт лежит в корне сайта с именем sitemap.php, вы хотите чтобы он открывался по адресу https://example.com/sitemap.xml . В файле .htaccess нужно добавить запись:

RewriteEngine On RewriteRule ^sitemap.xml$ sitemap.php [L,QSA]

Если скрипт сделан модулем CMS:

RewriteEngine On RewriteCond % ^/sitemap.xml RewriteRule (.*) /index.php?module=sitemap [L,QSA]

Sitemap в robots.txt

Чтобы поисковые системы знали где расположен файл карты сайта нужно добавить директиву Sitemap в robots.txt:

User-agent: * Sitemap: https://example.com/sitemap.xml

Источник

Читайте также:  Переключатели
Оцените статью