<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ars Longa, Vita Brevis &#187; SEO</title>
	<atom:link href="http://blog.sjinks.pro/seo/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sjinks.pro</link>
	<description>Quod scripsi, scripsi</description>
	<lastBuildDate>Mon, 06 Feb 2012 17:56:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Генерация карты сайта в HTML из XML: часть 3</title>
		<link>http://blog.sjinks.pro/seo/854-html-stemap-generation-from-xml-part-3/</link>
		<comments>http://blog.sjinks.pro/seo/854-html-stemap-generation-from-xml-part-3/#comments</comments>
		<pubDate>Sun, 28 Nov 2010 00:30:50 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Патчи]]></category>
		<category><![CDATA[Google XML Sitemaps]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[XSL]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>
		<category><![CDATA[преобразование]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=854</guid>
		<description><![CDATA[Автоматизация: перекладываем работу на Google XML Sitemaps Продолжение цикла статей на тему генерации карты сайта в HTML из карты XML. В данной статье будет рассмотрен вопрос модификации плагина Google XML Sitemaps с целью добавления поддержки автоматической генерации HTML-версии карты сайта; как и в предыдущих статьях, преобразование будет осуществляться средствами XSL. В первой части статьи мы [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/854-html-stemap-generation-from-xml-part-3/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Автоматизация: перекладываем работу на <a href="http://blog.sjinks.pro/tag/google/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Google">Google</a> <a href="http://blog.sjinks.pro/tag/xml/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XML">XML</a> Sitemaps</em></h2>
<p>Продолжение <a href="http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/">цикла</a> <a href="http://blog.sjinks.pro/seo/849-html-stemap-generation-from-xml-part-2/">статей</a> на тему <a href="/search/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BA%D0%B0%D1%80%D1%82%D1%8B%20%D1%81%D0%B0%D0%B9%D1%82%D0%B0%20%D0%B2%20HTML%20%D0%B8%D0%B7%20XML/">генерации карты сайта в HTML из карты XML</a>.</p>
<p>В данной статье будет рассмотрен вопрос модификации плагина <a href="http://blog.sjinks.pro/tag/google-xml-sitemaps/">Google XML Sitemaps</a> с целью добавления поддержки автоматической генерации <a href="http://blog.sjinks.pro/tag/html/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTML">HTML</a>-версии карты сайта; как и в предыдущих статьях, <a href="http://blog.sjinks.pro/tag/conversion/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  преобразование">преобразование</a> будет осуществляться средствами <a href="http://blog.sjinks.pro/tag/xsl/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XSL">XSL</a>.<span id="more-854"></span></p>
<p>В <a href="http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/">первой части</a> статьи мы рассматривали вариант, основанный на использовании утилиты <code>xsltproc</code>. Предполагалось, что генерация HTML-версии карты сайта осуществляется с использованием <code>cron</code>. Создание карты по расписанию означает, что построение HTML-карты будет запаздывать на некоторое время; а если не сравнивать время модификации XML- и HTML-версий карт, получим бесполезные вызовы <code>xsltproc</code>.</p>
<p>Те, кто используют <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a>, очень часто для автоматического построения карты сайта используют <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a> <a href="http://blog.sjinks.pro/tag/google-xml-sitemaps/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Google XML Sitemaps">Google XML Sitemaps</a>; для них предлагается вариант с модификацией кода плагина для автоматической генерации HTML-карты.</p>
<p>Плагин позволяет задавать свою таблицу стилей XSLT:</p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2010/11/gxs-options.png"><img src="http://static.sjinks.info/wp-content/uploads/2010/11/gxs-options-300x56.png" alt="Настройки Google XML Sitemaps" title="Настройки Google XML Sitemaps" width="300" height="56" class="alignnone size-medium wp-image-855" /></a></p>
<p>Мы изменим плагин таким образом, чтобы при заданной таблице стилей XSL плагин создавал HTML-файл с результатами преобразований XSL.</p>
<p>В файле <code>sitemap-core.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a></code> ищем такой кусок кода:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8544">
        <div class="code php" id="p854code4">
<ol class="php" style="font-family:monospace;" start="2169"><li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetOption</span><span class="br0">&#40;</span><span class="st0">&quot;b_xml&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span>_fileHandle <span class="sy0">&amp;&amp;</span> <span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span>_fileHandle<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span>_fileHandle <span class="sy0">=</span> <span class="kw4">null</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$status</span><span class="sy0">-&gt;</span><span class="me1">EndXml</span><span class="br0">&#40;</span><span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$pingUrl</span><span class="sy0">=</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetXmlUrl</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="re0">$status</span><span class="sy0">-&gt;</span><span class="me1">EndXml</span><span class="br0">&#40;</span><span class="kw4">false</span><span class="sy0">,</span><span class="st0">&quot;Could not close the sitemap file.&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>После него добавляем такой:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8545">
        <div class="code php" id="p854code5">
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">class_exists</span><span class="br0">&#40;</span><span class="st_h">'XSLTProcessor'</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$file</span> &nbsp; &nbsp; &nbsp; <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetXmlPath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$styleSheet</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetDefaultStyle</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetOption</span><span class="br0">&#40;</span><span class="st_h">'b_style_default'</span><span class="br0">&#41;</span> <span class="sy0">===</span> <span class="kw4">true</span> ? <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetDefaultStyle</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">GetOption</span><span class="br0">&#40;</span><span class="st_h">'b_style'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$styleSheet</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$xsl</span> <span class="sy0">=</span> <span class="kw2">new</span> DOMDocument<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$xsl</span><span class="sy0">-&gt;</span><span class="me1">load</span><span class="br0">&#40;</span><span class="re0">$styleSheet</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$xml</span> <span class="sy0">=</span> <span class="kw2">new</span> DOMDocument<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$xml</span><span class="sy0">-&gt;</span><span class="me1">load</span><span class="br0">&#40;</span><span class="re0">$file</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$proc</span> <span class="sy0">=</span> <span class="kw2">new</span> XSLTProcessor<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$proc</span><span class="sy0">-&gt;</span><span class="me1">importStyleSheet</span><span class="br0">&#40;</span><span class="re0">$xsl</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$proc</span><span class="sy0">-&gt;</span><span class="me1">transformToURI</span><span class="br0">&#40;</span><span class="re0">$xml</span><span class="sy0">,</span> <span class="st_h">'file://'</span> <span class="sy0">.</span> <span class="kw3">str_replace</span><span class="br0">&#40;</span><span class="st_h">'.xml'</span><span class="sy0">,</span> <span class="st_h">'.html'</span><span class="sy0">,</span> <span class="re0">$file</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Данный код требует PHP 5 и расширения XSLT (в Debian/Ubuntu оно предоставляется пакетом <code>php5-xsl</code>). Код получает имя файла с картой сайта и адрес таблицы стилей (этот адрес должен быть задан абсолютным URL); XML и XSL скармливаются XSLT Processor&#8217;у, результат записывается в файл с тем же именем, что и карта сайта XML, но с расширением <code>.html</code>.</p>
<p>Теперь при каждом построении карты сайта будет создаваться и HTML-версия.</p>
<p>Тем, кто любит патчи (<a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">патч</a> кумулятивный, исправляет и некоторые другие недостатки плагина):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8546">
        <div class="code diff" id="p854code6">
--- sitemap-core.php.orig &nbsp; 2010-08-16 10:49:16.000000000 +0300<br />
<span class="re4">+++ sitemap-core.php&nbsp; &nbsp; <span class="nu0">2010</span>-<span class="nu0">11</span>-<span class="nu0">28</span> 02:<span class="nu0">10</span>:<span class="nu0">08.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">1654</span>,<span class="nu0">9</span> +<span class="nu0">1654</span>,<span class="nu0">9</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorXmlEntry<span class="br0">&#40;</span>'&lt;' . '?xml-stylesheet type=&quot;text/xsl&quot; href=&quot;' . $styleSheet . '&quot;?' . '&gt;'<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<span class="re7">- &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;generator=\&quot;wordpress/&quot; . get_bloginfo<span class="br0">&#40;</span>'version'<span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;sitemap-generator-url=\&quot;http://www.arnebrachhold.de\&quot; sitemap-generator-version=\&quot;&quot; . $this-&gt;GetVersion<span class="br0">&#40;</span><span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;generated-on=\&quot;&quot; . date<span class="br0">&#40;</span>get_option<span class="br0">&#40;</span>&quot;date_format&quot;<span class="br0">&#41;</span> . &quot; &quot; . get_option<span class="br0">&#40;</span>&quot;time_format&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+// &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;generator=\&quot;wordpress/&quot; . get_bloginfo<span class="br0">&#40;</span>'version'<span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+// &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;sitemap-generator-url=\&quot;http://www.arnebrachhold.de\&quot; sitemap-generator-version=\&quot;&quot; . $this-&gt;GetVersion<span class="br0">&#40;</span><span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+// &nbsp; &nbsp; $this-&gt;AddElement<span class="br0">&#40;</span>new GoogleSitemapGeneratorDebugEntry<span class="br0">&#40;</span>&quot;generated-on=\&quot;&quot; . date<span class="br0">&#40;</span>get_option<span class="br0">&#40;</span>&quot;date_format&quot;<span class="br0">&#41;</span> . &quot; &quot; . get_option<span class="br0">&#40;</span>&quot;time_format&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //All comments as an asso. Array <span class="br0">&#40;</span>postID=&gt;commentCount<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; $comments=<span class="br0">&#40;</span>$this-&gt;GetOption<span class="br0">&#40;</span>&quot;b_prio_provider&quot;<span class="br0">&#41;</span>!=&quot;&quot;?$this-&gt;GetComments<span class="br0">&#40;</span><span class="br0">&#41;</span>:array<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="re6">@@ -<span class="nu0">2172</span>,<span class="nu0">6</span> +<span class="nu0">2172</span>,<span class="nu0">22</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $status-&gt;EndXml<span class="br0">&#40;</span>true<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $pingUrl=$this-&gt;GetXmlUrl<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> else $status-&gt;EndXml<span class="br0">&#40;</span>false,&quot;Could not close the sitemap file.&quot;<span class="br0">&#41;</span>;<br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>class_exists<span class="br0">&#40;</span>'XSLTProcessor', true<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $file &nbsp; &nbsp; &nbsp; = $this-&gt;GetXmlPath<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $styleSheet = <span class="br0">&#40;</span>$this-&gt;GetDefaultStyle<span class="br0">&#40;</span><span class="br0">&#41;</span> &amp;&amp; $this-&gt;GetOption<span class="br0">&#40;</span>'b_style_default'<span class="br0">&#41;</span> === true ? $this-&gt;GetDefaultStyle<span class="br0">&#40;</span><span class="br0">&#41;</span> : $this-&gt;GetOption<span class="br0">&#40;</span>'b_style'<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>!empty<span class="br0">&#40;</span>$styleSheet<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $xsl = new DOMDocument<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $xsl-&gt;load<span class="br0">&#40;</span>$styleSheet<span class="br0">&#41;</span>;</span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $xml = new DOMDocument<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $xml-&gt;load<span class="br0">&#40;</span>$file<span class="br0">&#41;</span>;</span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $proc = new XSLTProcessor<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $proc-&gt;importStyleSheet<span class="br0">&#40;</span>$xsl<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $proc-&gt;transformToURI<span class="br0">&#40;</span>$xml, 'file://' . str_replace<span class="br0">&#40;</span>'.xml', '.html', $file<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; if<span class="br0">&#40;</span>$this-&gt;IsGzipEnabled<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re6">@@ -<span class="nu0">2514</span>,<span class="nu0">9</span> +<span class="nu0">2530</span>,<span class="nu0">9</span> @@</span><br />
&nbsp; &nbsp; &nbsp;* @return int The time in seconds<br />
&nbsp; &nbsp; &nbsp;*/<br />
&nbsp; &nbsp; function GetTimestampFromMySql<span class="br0">&#40;</span>$mysqlDateTime<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; list<span class="br0">&#40;</span>$date, $hours<span class="br0">&#41;</span> = split<span class="br0">&#40;</span>' ', $mysqlDateTime<span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; list<span class="br0">&#40;</span>$year,$month,$day<span class="br0">&#41;</span> = split<span class="br0">&#40;</span>'-',$date<span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; list<span class="br0">&#40;</span>$hour,$min,$sec<span class="br0">&#41;</span> = split<span class="br0">&#40;</span>':',$hours<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; list<span class="br0">&#40;</span>$date, $hours<span class="br0">&#41;</span> = explode<span class="br0">&#40;</span>' ', $mysqlDateTime<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; list<span class="br0">&#40;</span>$year,$month,$day<span class="br0">&#41;</span> = explode<span class="br0">&#40;</span>'-',$date<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; list<span class="br0">&#40;</span>$hour,$min,$sec<span class="br0">&#41;</span> = explode<span class="br0">&#40;</span>':',$hours<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; return mktime<span class="br0">&#40;</span>intval<span class="br0">&#40;</span>$hour<span class="br0">&#41;</span>, intval<span class="br0">&#40;</span>$min<span class="br0">&#41;</span>, intval<span class="br0">&#40;</span>$sec<span class="br0">&#41;</span>, intval<span class="br0">&#40;</span>$month<span class="br0">&#41;</span>, intval<span class="br0">&#40;</span>$day<span class="br0">&#41;</span>, intval<span class="br0">&#40;</span>$year<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/854-html-stemap-generation-from-xml-part-3/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/seo/854-html-stemap-generation-from-xml-part-3/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Генерация карты сайта в HTML из XML: часть 2</title>
		<link>http://blog.sjinks.pro/seo/849-html-stemap-generation-from-xml-part-2/</link>
		<comments>http://blog.sjinks.pro/seo/849-html-stemap-generation-from-xml-part-2/#comments</comments>
		<pubDate>Mon, 08 Nov 2010 12:04:38 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XSL]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=849</guid>
		<description><![CDATA[Как сделать не более N ссылок на файл Продолжение статьи «Генерация карты сайта в HTML из XML». В этой части мы рассмотрим, как сделать так, чтобы на одной генерируемой странице располагалось не более определённого количества ссылок. Нам понадобятся: XSL из статьи «Преобразование карты сайта в список адресов для siege»: &#60;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&#62; &#60;xsl:stylesheet version=&#34;1.0&#34; xmlns:xsl=&#34;http://www.w3.org/1999/XSL/Transform&#34; [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/849-html-stemap-generation-from-xml-part-2/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Как сделать не более N ссылок на файл</em></h2>
<p>Продолжение статьи <strong>«<a href="http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/">Генерация карты сайта в HTML из XML</a>»</strong>.</p>
<p>В этой части мы рассмотрим, как сделать так, чтобы на одной генерируемой странице располагалось не более определённого количества ссылок.<span id="more-849"></span></p>
<p>Нам понадобятся:</p>
<ul>
<li><a href="http://blog.sjinks.pro/tag/xsl/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XSL">XSL</a> из статьи <strong>«<a href="http://blog.sjinks.pro/linux/722-transform-sitemap-to-siege-url-list/">Преобразование карты сайта в список адресов для siege</a>»</strong>:
          
<div class="codebox">
    <div class="the_code" style="" id="p84910">
        <div class="code xml" id="p849code10">
<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;utf-8&quot;</span><span class="re2">?&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;xsl:stylesheet</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">xmlns:xsl</span>=<span class="st0">&quot;http://www.w3.org/1999/XSL/Transform&quot;</span> <span class="re0">xmlns:x</span>=<span class="st0">&quot;http://www.sitemaps.org/schemas/sitemap/0.9&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:output</span> <span class="re0">method</span>=<span class="st0">&quot;text&quot;</span> <span class="re0">media-type</span>=<span class="st0">&quot;text-plain&quot;</span> <span class="re0">indent</span>=<span class="st0">&quot;no&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:strip-space</span> <span class="re0">elements</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:template</span> <span class="re0">match</span>=<span class="st0">&quot;/x:urlset/x:url&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:value-of</span> <span class="re0">select</span>=<span class="st0">&quot;x:loc&quot;</span> <span class="re0">disable-output-escaping</span>=<span class="st0">&quot;yes&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:text<span class="re2">&gt;</span></span></span><span class="sc1">&amp;#x000A;</span><span class="sc3"><span class="re1">&lt;/xsl:text<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/xsl:template<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/xsl:stylesheet<span class="re2">&gt;</span></span></span>
        </div>
    </div>
</div>

</li>
<li>XSL из статьи <strong>«<a href="http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/">Генерация карты сайта в HTML из XML</a>»</strong>:
          
<div class="codebox">
    <div class="the_code" style="" id="p84911">
        <div class="code xml" id="p849code11">
<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;utf-8&quot;</span><span class="re2">?&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;xsl:stylesheet</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">xmlns:xsl</span>=<span class="st0">&quot;http://www.w3.org/1999/XSL/Transform&quot;</span> <span class="re0">xmlns:x</span>=<span class="st0">&quot;http://www.sitemaps.org/schemas/sitemap/0.9&quot;</span> <span class="re0">xmlns</span>=<span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span> <span class="re0">exclude-result-prefixes</span>=<span class="st0">&quot;x&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:output</span> <span class="re0">method</span>=<span class="st0">&quot;xml&quot;</span> <span class="re0">indent</span>=<span class="st0">&quot;yes&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span> <span class="re0">doctype-public</span>=<span class="st0">&quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;</span> <span class="re0">doctype-system</span>=<span class="st0">&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:strip-space</span> <span class="re0">elements</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span><br />
<br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:template</span> <span class="re0">match</span>=<span class="st0">&quot;/x:urlset&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;html<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;head<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;meta</span> <span class="re0">http-equiv</span>=<span class="st0">&quot;Content-Type&quot;</span> <span class="re0">content</span>=<span class="st0">&quot;text/html; charset=utf-8&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;title<span class="re2">&gt;</span></span></span>Site Map<span class="sc3"><span class="re1">&lt;/title<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/head<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;body<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;h1<span class="re2">&gt;</span></span><span class="re1">&lt;a</span> <span class="re0">href</span>=<span class="st0">&quot;http://blog.sjinks.pro/&quot;</span><span class="re2">&gt;</span></span>Карта сайта<span class="sc3"><span class="re1">&lt;/a<span class="re2">&gt;</span></span><span class="re1">&lt;/h1<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;ul<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:apply-templates</span> <span class="re0">select</span>=<span class="st0">&quot;x:url&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/ul<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/body<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/html<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/xsl:template<span class="re2">&gt;</span></span></span><br />
<br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:template</span> <span class="re0">match</span>=<span class="st0">&quot;/x:urlset/x:url&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;li<span class="re2">&gt;</span></span><span class="re1">&lt;strong<span class="re2">&gt;</span></span><span class="re1">&lt;a</span> <span class="re0">href</span>=<span class="st0">&quot;{x:loc}&quot;</span><span class="re2">&gt;</span><span class="re1">&lt;xsl:value-of</span> <span class="re0">select</span>=<span class="st0">&quot;x:loc&quot;</span> <span class="re0">disable-output-escaping</span>=<span class="st0">&quot;yes&quot;</span><span class="re2">/&gt;</span><span class="re1">&lt;/a<span class="re2">&gt;</span></span><span class="re1">&lt;/strong<span class="re2">&gt;</span></span><span class="re1">&lt;/li<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/xsl:template<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/xsl:stylesheet<span class="re2">&gt;</span></span></span>
        </div>
    </div>
</div>

</li>
<li>Немного фантазии <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<p>Алгоритм работы простой:</p>
<ol>
<li>Преобразовываем исходную карту в текстовый список адресов (один URL на строку)</li>
<li><a href="http://linux.die.net/man/1/split">Разбиваем</a> файл на несколько частей с заданным количеством строк</li>
<li>Преобразовываем каждый из полученных файлов в <a href="http://blog.sjinks.pro/tag/xml/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XML">XML</a></li>
<li>Преобразовываем полученные XML-файлы в <a href="http://blog.sjinks.pro/tag/html/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTML">HTML</a></li>
</ol>
<p>Пункты 3 и 4 можно совместить: вместо генерации XML-файла можно сразу генерировать HTML. Но на всякий случай будем генерировать и XML, и HTML.</p>
<p>Получим такой скрипт:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p84912">
        <div class="code bash" id="p849code12">
<span class="co0">#! /bin/sh</span><br />
<br />
xsltproc <span class="re5">-o</span> urls.txt sitemap2txt.xsl sitemap.xml<br />
<span class="kw2">split</span> <span class="re5">-d</span> <span class="re5">-l</span> 100 urls.txt map<br />
<span class="kw1">for</span> i <span class="kw1">in</span> map<span class="sy0">*</span>; <span class="kw1">do</span><br />
&nbsp; &nbsp; <span class="kw2">awk</span> <span class="st_h">'<br />
&nbsp; &nbsp; BEGIN {<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &quot;&lt;?xml version=\&quot;1.0\&quot;?&gt;\<br />
&lt;urlset\<br />
&nbsp; &nbsp; xmlns:xsi=\&quot;http://www.w3.org/2001/XMLSchema-instance\&quot;\<br />
&nbsp; &nbsp; xsi:schemaLocation=\&quot;http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd\&quot;\<br />
&nbsp; &nbsp; xmlns=\&quot;http://www.sitemaps.org/schemas/sitemap/0.9\&quot;&gt;&quot;<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &quot;&lt;url&gt;&lt;loc&gt;&quot;$1&quot;&lt;/loc&gt;&lt;/url&gt;&quot;<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; END {<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &quot;&lt;/urlset&gt;&quot;<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; '</span> <span class="re1">$i</span> <span class="sy0">&gt;</span> site<span class="re1">$i</span>.xml<br />
&nbsp; &nbsp; xsltproc <span class="re5">-o</span> site<span class="re1">$i</span>.html sitemap2html.xsl site<span class="re1">$i</span>.xml<br />
<span class="kw1">done</span>
        </div>
    </div>
</div>

<p>Всё просто!™</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/849-html-stemap-generation-from-xml-part-2/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/seo/849-html-stemap-generation-from-xml-part-2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Генерация карты сайта в HTML из XML</title>
		<link>http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/</link>
		<comments>http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/#comments</comments>
		<pubDate>Sun, 07 Nov 2010 01:22:20 +0000</pubDate>
		<dc:creator>Wandering Soul</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XSL]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=847</guid>
		<description><![CDATA[Помогаем ботам найти все страница сайта Проблема: есть достаточно большой сайт, у которого есть карта в формате XML. Есть бот, который этот сайт индексирует. Но бот не может найти страницы, имеющие уровень вложенности больше трёх. Нужно помочь боту проиндексировать весь сайт. Самый простой способ — создание страницы, в которой будут перечислены все страницы сайта и размещение на [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Помогаем ботам найти все страница сайта</em></h2>
<p><strong>Проблема:</strong> есть достаточно большой сайт, у которого есть <a href="/sitemap.xml">карта в формате XML</a>. Есть бот, который этот сайт индексирует. Но бот не может найти страницы, имеющие уровень вложенности больше трёх. Нужно помочь боту проиндексировать весь сайт.</p>
<p>Самый простой способ — создание страницы, в которой будут перечислены все страницы сайта и размещение на неё ссылки из подвала сайта. Идеальный кандидат на такую страницу — карта сайта в формате <a href="http://blog.sjinks.pro/tag/xml/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XML">XML</a>. Проблема в том, что не все боты утруждают себя разбором <a href="http://blog.sjinks.pro/tag/xml/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XML">XML</a>-карт. Для таких ботов карту нужно преобразовывать в формат <a href="http://blog.sjinks.pro/tag/html/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTML">HTML</a>.<span id="more-847"></span></p>
<p>Как и в <a href="http://blog.sjinks.pro/linux/722-transform-sitemap-to-siege-url-list/">другом похожем случае</a>, на помощь приходит <a href="http://blog.sjinks.pro/tag/conversion/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  преобразование">преобразование</a> <a href="http://blog.sjinks.pro/tag/xsl/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XSL">XSL</a>.</p>
<p>Пример шаблона стилей XML:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p84715">
        <div class="code xml" id="p847code15">
<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;utf-8&quot;</span><span class="re2">?&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;xsl:stylesheet</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">xmlns:xsl</span>=<span class="st0">&quot;http://www.w3.org/1999/XSL/Transform&quot;</span> <span class="re0">xmlns:x</span>=<span class="st0">&quot;http://www.sitemaps.org/schemas/sitemap/0.9&quot;</span> <span class="re0">xmlns</span>=<span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span> <span class="re0">exclude-result-prefixes</span>=<span class="st0">&quot;x&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:output</span> <span class="re0">method</span>=<span class="st0">&quot;xml&quot;</span> <span class="re0">indent</span>=<span class="st0">&quot;yes&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span> <span class="re0">doctype-public</span>=<span class="st0">&quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;</span> <span class="re0">doctype-system</span>=<span class="st0">&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:strip-space</span> <span class="re0">elements</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span><br />
<br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:template</span> <span class="re0">match</span>=<span class="st0">&quot;/x:urlset&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;html<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;head<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;meta</span> <span class="re0">http-equiv</span>=<span class="st0">&quot;Content-Type&quot;</span> <span class="re0">content</span>=<span class="st0">&quot;text/html; charset=utf-8&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;title<span class="re2">&gt;</span></span></span>Site Map<span class="sc3"><span class="re1">&lt;/title<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/head<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;body<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;h1<span class="re2">&gt;</span></span><span class="re1">&lt;a</span> <span class="re0">href</span>=<span class="st0">&quot;http://blog.sjinks.pro/&quot;</span><span class="re2">&gt;</span></span>Карта сайта<span class="sc3"><span class="re1">&lt;/a<span class="re2">&gt;</span></span><span class="re1">&lt;/h1<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;ul<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:apply-templates</span> <span class="re0">select</span>=<span class="st0">&quot;x:url&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:sort</span> <span class="re0">select</span>=<span class="st0">&quot;lastmod&quot;</span> <span class="re0">order</span>=<span class="st0">&quot;descending&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/xsl:apply-templates<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/ul<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/body<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/html<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/xsl:template<span class="re2">&gt;</span></span></span><br />
<br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:template</span> <span class="re0">match</span>=<span class="st0">&quot;/x:urlset/x:url&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;li<span class="re2">&gt;</span></span><span class="re1">&lt;strong<span class="re2">&gt;</span></span><span class="re1">&lt;a</span> <span class="re0">href</span>=<span class="st0">&quot;{x:loc}&quot;</span><span class="re2">&gt;</span><span class="re1">&lt;xsl:value-of</span> <span class="re0">select</span>=<span class="st0">&quot;x:loc&quot;</span> <span class="re0">disable-output-escaping</span>=<span class="st0">&quot;yes&quot;</span><span class="re2">/&gt;</span><span class="re1">&lt;/a<span class="re2">&gt;</span></span><span class="re1">&lt;/strong<span class="re2">&gt;</span></span><span class="re1">&lt;xsl:if</span> <span class="re0">test</span>=<span class="st0">&quot;x:lastmod&quot;</span><span class="re2">&gt;</span></span> (<span class="sc3"><span class="re1">&lt;xsl:value-of</span> <span class="re0">select</span>=<span class="st0">&quot;x:lastmod&quot;</span> <span class="re0">disable-output-escaping</span>=<span class="st0">&quot;yes&quot;</span><span class="re2">/&gt;</span></span>)<span class="sc3"><span class="re1">&lt;/xsl:if<span class="re2">&gt;</span></span><span class="re1">&lt;/li<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/xsl:template<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/xsl:stylesheet<span class="re2">&gt;</span></span></span>
        </div>
    </div>
</div>

<p>Преобразование выполняется так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p84716">
        <div class="code bash" id="p847code16">
xsltproc <span class="re5">-o</span> <span class="sy0">/</span>path<span class="sy0">/</span>to<span class="sy0">/</span>sitemap.html <span class="sy0">/</span>path<span class="sy0">/</span>to<span class="sy0">/</span>sitemap2html.xml <span class="sy0">/</span>path<span class="sy0">/</span>to<span class="sy0">/</span>sitemap.xml
        </div>
    </div>
</div>

<p>Можно выполнение <code>xsltproc</code> повесить на крон и наслаждаться результатом.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Конфигурация nginx для работы с Simple Machines Forum</title>
		<link>http://blog.sjinks.pro/seo/823-nginx-configuration-simple-machines-forum/</link>
		<comments>http://blog.sjinks.pro/seo/823-nginx-configuration-simple-machines-forum/#comments</comments>
		<pubDate>Thu, 23 Sep 2010 01:32:18 +0000</pubDate>
		<dc:creator>Wandering Soul</dc:creator>
				<category><![CDATA[nginx]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Simple Machines Forum]]></category>
		<category><![CDATA[SMF]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=823</guid>
		<description><![CDATA[Настройка pretty permalinks в Simple Machines Forum при использовании nginx Simple Machines Forum (SMF) — бесплатный интернет-форум, написанный на PHP и использующий базу данных MySQL. «Дружественные URL» (ЧПУ) поддерживает только для Apache; для nginx, как водится, официальной поддержки нет. Поэтому в данной статье пойдёт речь именно о том, как заставить работать ЧПУ в nginx. Начнём с [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/823-nginx-configuration-simple-machines-forum/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Настройка pretty permalinks в Simple Machines Forum при использовании <a href="http://blog.sjinks.pro/tag/nginx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  nginx">nginx</a></em></h2>
<p>Simple Machines Forum (<a href="http://blog.sjinks.pro/tag/simple-machines-forum/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SMF">SMF</a>) — бесплатный интернет-форум, написанный на <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a> и использующий базу данных MySQL.</p>
<p>«Дружественные URL» (ЧПУ) поддерживает только для Apache; для nginx, как водится, официальной поддержки нет. Поэтому в данной статье пойдёт речь именно о том, как заставить работать ЧПУ в nginx.<span id="more-823"></span></p>
<p>Начнём с того, что ЧПУ в SMF работают только через PATHINFO (ссылки вида <code>index.php/something/goes/here</code>). Это досадное недоразумение, к счастью, лечится.</p>
<p>Начнём с конфигурации виртуального хоста:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p82322">
        <div class="code nginx" id="p823code22">
<span class="kw1">server</span> {<br />
&nbsp; &nbsp; <span class="kw1">server_name</span> forum.example.com;<br />
<br />
&nbsp; &nbsp; <span class="kw1">root</span> /var/www/forum.example.com;<br />
&nbsp; &nbsp; <span class="kw1">index</span> <span class="kw1">index</span>.php;<br />
<br />
&nbsp; &nbsp; <span class="kw1">rewrite</span> ^/<span class="kw1">index</span>\.php/([a-z]+),([0-9]+)\.(\w+)/(\w+),(\w+)/(\w+)\.html /<span class="kw1">index</span>.php?$1=$2.$3&amp;$4=$5&amp;$6 last;<br />
&nbsp; &nbsp; <span class="kw1">rewrite</span> ^/<span class="kw1">index</span>\.php/([a-z]+),([0-9]+)\.(\w+)/(\w+),(\w+)\.html /<span class="kw1">index</span>.php?$1=$2.$3&amp;$4=$5 last;<br />
&nbsp; &nbsp; <span class="kw1">rewrite</span> ^/<span class="kw1">index</span>\.php/([a-z]+),([0-9]+)\.(\w+)/(\w+)/(\w+)\.html /<span class="kw1">index</span>.php?$1=$2.$3&amp;$4&amp;$5 last;<br />
&nbsp; &nbsp; <span class="kw1">rewrite</span> ^/<span class="kw1">index</span>\.php/([a-z]+),([0-9]+)\.(\w+)/(\w+)\.html /<span class="kw1">index</span>.php?$1=$2.$3&amp;$4 last;<br />
&nbsp; &nbsp; <span class="kw1">rewrite</span> ^/<span class="kw1">index</span>\.php/([a-z]+),([0-9]+)\.(\w+)\.html /<span class="kw1">index</span>.php?$1=$2.$3 last;<br />
<br />
&nbsp; &nbsp; <span class="kw1">rewrite</span> ^/([a-z]+),([0-9]+)\.(\w+)/(\w+),(\w+)/(\w+)\.html /<span class="kw1">index</span>.php?$1=$2.$3&amp;$4=$5&amp;$6 last;<br />
&nbsp; &nbsp; <span class="kw1">rewrite</span> ^/([a-z]+),([0-9]+)\.(\w+)/(\w+),(\w+)\.html /<span class="kw1">index</span>.php?$1=$2.$3&amp;$4=$5 last;<br />
&nbsp; &nbsp; <span class="kw1">rewrite</span> ^/([a-z]+),([0-9]+)\.(\w+)/(\w+)/(\w+)\.html /<span class="kw1">index</span>.php?$1=$2.$3&amp;$4&amp;$5 last;<br />
&nbsp; &nbsp; <span class="kw1">rewrite</span> ^/([a-z]+),([0-9]+)\.(\w+)/(\w+)\.html /<span class="kw1">index</span>.php?$1=$2.$3&amp;$4 last;<br />
&nbsp; &nbsp; <span class="kw1">rewrite</span> ^/([a-z]+),([0-9]+)\.(\w+)\.html /<span class="kw1">index</span>.php?$1=$2.$3 last;<br />
<br />
&nbsp; &nbsp; <span class="kw1">location</span> ~ \.php$ {<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_index</span> <span class="kw1">index</span>.php;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_pass</span> unix:/dev/shm/php-fcgi.sock;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_param</span> SCRIPT_FILENAME $document_root$fastcgi_script_name;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">include</span> /etc/nginx/fastcgi_params;<br />
&nbsp; &nbsp; }<br />
}
        </div>
    </div>
</div>

<p>Я сознательно сделал два блока <code>rewrite</code>: первый (который содержит <code>index\.php</code>) предназначен для PATHINFO-ссылок; второй блок предназначен для нормальных ЧПУ. В принципе, достаточно только одного из блоков — в зависимости от того, какой тип ссылок планируется использовать.</p>
<p>Тем не менее, после конфигурирования nginx и включения «Дружественных URL» в панели управления форумом SMF всё равно продолжает использовать «человеконепонятные» URL. В чём причина? В движке форума: разработчики постарались, чтобы «Дружественные URL» работали только в Apache. Чтобы решить проблему, нужно немного подправить исходный код форума.</p>
<p>Открываем файл <code>Sources/QueryString.php</code>, в нём ищем функцию <code>ob_sessrewrite</code> (в 1.1.11 это самая последняя функция, располагается в конце файла).</p>
<p>В файле ищем такие строки:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p82323">
        <div class="code php" id="p823code23">
<ol class="php" style="font-family:monospace;" start="450"><li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// This should work even in 4.2.x, just not CGI without cgi.fix_pathinfo.</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$modSettings</span><span class="br0">&#91;</span><span class="st_h">'queryless_urls'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$context</span><span class="br0">&#91;</span><span class="st_h">'server'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'is_cgi'</span><span class="br0">&#93;</span> <span class="sy0">||</span> <span class="sy0">@</span><span class="kw3">ini_get</span><span class="br0">&#40;</span><span class="st_h">'cgi.fix_pathinfo'</span><span class="br0">&#41;</span> <span class="sy0">==</span> 1<span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="re0">$context</span><span class="br0">&#91;</span><span class="st_h">'server'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'is_apache'</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>Исправляем условие в <code>if</code>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p82324">
        <div class="code php" id="p823code24">
<ol class="php" style="font-family:monospace;" start="450"><li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// This should work even in 4.2.x, just not CGI without cgi.fix_pathinfo.</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">true</span> <span class="sy0">||</span> <span class="sy0">!</span><span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$modSettings</span><span class="br0">&#91;</span><span class="st_h">'queryless_urls'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$context</span><span class="br0">&#91;</span><span class="st_h">'server'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'is_cgi'</span><span class="br0">&#93;</span> <span class="sy0">||</span> <span class="sy0">@</span><span class="kw3">ini_get</span><span class="br0">&#40;</span><span class="st_h">'cgi.fix_pathinfo'</span><span class="br0">&#41;</span> <span class="sy0">==</span> 1<span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="re0">$context</span><span class="br0">&#91;</span><span class="st_h">'server'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'is_apache'</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>Сохраняем; после этого форум будет генерировать PATHINFO-ссылки. Если же index.php в ссылках смотрится некрасиво, то код нужно еще немного поправить:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p82325">
        <div class="code php" id="p823code25">
<ol class="php" style="font-family:monospace;" start="450"><li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// This should work even in 4.2.x, just not CGI without cgi.fix_pathinfo.</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">true</span> <span class="sy0">||</span> <span class="sy0">!</span><span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$modSettings</span><span class="br0">&#91;</span><span class="st_h">'queryless_urls'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$context</span><span class="br0">&#91;</span><span class="st_h">'server'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'is_cgi'</span><span class="br0">&#93;</span> <span class="sy0">||</span> <span class="sy0">@</span><span class="kw3">ini_get</span><span class="br0">&#40;</span><span class="st_h">'cgi.fix_pathinfo'</span><span class="br0">&#41;</span> <span class="sy0">==</span> 1<span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="re0">$context</span><span class="br0">&#91;</span><span class="st_h">'server'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'is_apache'</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Let's do something special for session ids!</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">defined</span><span class="br0">&#40;</span><span class="st_h">'SID'</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> SID <span class="sy0">!=</span> <span class="st_h">''</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$buffer</span> <span class="sy0">=</span> <span class="kw3">preg_replace</span><span class="br0">&#40;</span><span class="st_h">'/&quot;'</span> <span class="sy0">.</span> <span class="kw3">preg_quote</span><span class="br0">&#40;</span><span class="re0">$scripturl</span><span class="sy0">,</span> <span class="st_h">'/'</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'\?(?:'</span> <span class="sy0">.</span> SID <span class="sy0">.</span> <span class="st_h">';)((?:board|topic)=[^#&quot;]+?)(#[^&quot;]*?)?&quot;/e'</span><span class="sy0">,</span> <span class="st0">&quot;'<span class="es1">\&quot;</span>' . <span class="es1">\$</span>scripturl . '/' . strtr('<span class="es1">\$</span>1', '&amp;;=', '//,') . '.html?' . SID . '<span class="es1">\$</span>2<span class="es1">\&quot;</span>'&quot;</span><span class="sy0">,</span> <span class="re0">$buffer</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$buffer</span> <span class="sy0">=</span> <span class="kw3">preg_replace</span><span class="br0">&#40;</span><span class="st_h">'/&quot;'</span> <span class="sy0">.</span> <span class="kw3">preg_quote</span><span class="br0">&#40;</span><span class="re0">$scripturl</span><span class="sy0">,</span> <span class="st_h">'/'</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'\?((?:board|topic)=[^#&quot;]+?)(#[^&quot;]*?)?&quot;/e'</span><span class="sy0">,</span> <span class="st0">&quot;'<span class="es1">\&quot;</span>' . <span class="es1">\$</span>scripturl . '/' . strtr('<span class="es1">\$</span>1', '&amp;;=', '//,') . '.html<span class="es1">\$</span>2<span class="es1">\&quot;</span>'&quot;</span><span class="sy0">,</span> <span class="re0">$buffer</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>Перед закрывающей скобкой нужно дописать две строчки:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p82326">
        <div class="code php" id="p823code26">
<ol class="php" style="font-family:monospace;" start="450"><li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// This should work even in 4.2.x, just not CGI without cgi.fix_pathinfo.</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">true</span> <span class="sy0">||</span> <span class="sy0">!</span><span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$modSettings</span><span class="br0">&#91;</span><span class="st_h">'queryless_urls'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="re0">$context</span><span class="br0">&#91;</span><span class="st_h">'server'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'is_cgi'</span><span class="br0">&#93;</span> <span class="sy0">||</span> <span class="sy0">@</span><span class="kw3">ini_get</span><span class="br0">&#40;</span><span class="st_h">'cgi.fix_pathinfo'</span><span class="br0">&#41;</span> <span class="sy0">==</span> 1<span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="re0">$context</span><span class="br0">&#91;</span><span class="st_h">'server'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'is_apache'</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Let's do something special for session ids!</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">defined</span><span class="br0">&#40;</span><span class="st_h">'SID'</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> SID <span class="sy0">!=</span> <span class="st_h">''</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$buffer</span> <span class="sy0">=</span> <span class="kw3">preg_replace</span><span class="br0">&#40;</span><span class="st_h">'/&quot;'</span> <span class="sy0">.</span> <span class="kw3">preg_quote</span><span class="br0">&#40;</span><span class="re0">$scripturl</span><span class="sy0">,</span> <span class="st_h">'/'</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'\?(?:'</span> <span class="sy0">.</span> SID <span class="sy0">.</span> <span class="st_h">';)((?:board|topic)=[^#&quot;]+?)(#[^&quot;]*?)?&quot;/e'</span><span class="sy0">,</span> <span class="st0">&quot;'<span class="es1">\&quot;</span>' . <span class="es1">\$</span>scripturl . '/' . strtr('<span class="es1">\$</span>1', '&amp;;=', '//,') . '.html?' . SID . '<span class="es1">\$</span>2<span class="es1">\&quot;</span>'&quot;</span><span class="sy0">,</span> <span class="re0">$buffer</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$buffer</span> <span class="sy0">=</span> <span class="kw3">preg_replace</span><span class="br0">&#40;</span><span class="st_h">'/&quot;'</span> <span class="sy0">.</span> <span class="kw3">preg_quote</span><span class="br0">&#40;</span><span class="re0">$scripturl</span><span class="sy0">,</span> <span class="st_h">'/'</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'\?((?:board|topic)=[^#&quot;]+?)(#[^&quot;]*?)?&quot;/e'</span><span class="sy0">,</span> <span class="st0">&quot;'<span class="es1">\&quot;</span>' . <span class="es1">\$</span>scripturl . '/' . strtr('<span class="es1">\$</span>1', '&amp;;=', '//,') . '.html<span class="es1">\$</span>2<span class="es1">\&quot;</span>'&quot;</span><span class="sy0">,</span> <span class="re0">$buffer</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$buffer</span> <span class="sy0">=</span> <span class="kw3">str_replace</span><span class="br0">&#40;</span><span class="st_h">'index.php/'</span><span class="sy0">,</span> <span class="st_h">''</span><span class="sy0">,</span> <span class="re0">$buffer</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$buffer</span> <span class="sy0">=</span> <span class="kw3">str_replace</span><span class="br0">&#40;</span><span class="st_h">'index.php'</span><span class="sy0">,</span> <span class="st_h">''</span><span class="sy0">,</span> <span class="re0">$buffer</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>После этого можно использовать нормальные ЧПУ.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/823-nginx-configuration-simple-machines-forum/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/seo/823-nginx-configuration-simple-machines-forum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Конфигурация nginx для работы с FUDforum</title>
		<link>http://blog.sjinks.pro/seo/820-nginx-configuration-fudforum/</link>
		<comments>http://blog.sjinks.pro/seo/820-nginx-configuration-fudforum/#comments</comments>
		<pubDate>Mon, 13 Sep 2010 02:32:01 +0000</pubDate>
		<dc:creator>Wandering Soul</dc:creator>
				<category><![CDATA[nginx]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[FUDforum]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=820</guid>
		<description><![CDATA[Настройка PATHINFO и pretty permalinks в FUDforum при использовании nginx FUDforum (Fast Uncompromising Discussion forum, Быстрый бескомпромиссный дискуссионный форум) — бесплатный интернет-форум с открытым кодом, обладающий широкими возможностями настройки и имеющий большой набор всяких плюшек и вкусностей. В данной статье пойдёт речь о том, как подружить форум с nginx. Официальный FAQ говорит о том, что FUDforum поддерживает [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/820-nginx-configuration-fudforum/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Настройка PATHINFO и pretty permalinks в <a href="http://blog.sjinks.pro/tag/fudforum/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  FUDforum">FUDforum</a> при использовании <a href="http://blog.sjinks.pro/tag/nginx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  nginx">nginx</a></em></h2>
<p><a href="http://fudforum.org/forum/">FUDforum</a> (Fast Uncompromising Discussion forum, Быстрый бескомпромиссный дискуссионный форум) — бесплатный интернет-форум с открытым кодом, обладающий  широкими возможностями настройки и имеющий большой набор всяких плюшек и вкусностей.</p>
<p>В данной статье пойдёт речь о том, как подружить форум с nginx.<span id="more-820"></span></p>
<p><a href="http://cvs.prohost.org/index.php/Frequently_Asked_Questions#Can_I_change_the_URL_format.2F_use_SEO_.28search_engine_friendly.29_URLs.3F" rel="nofollow">Официальный <abbr title="Frequently Asked Questions">FAQ</abbr></a> говорит о том, что FUDforum поддерживает как традиционные (со строкой запроса), так и PATHINFO-ссылки (то есть ссылки вида <code>index.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a>/something/goes/here</code>).</p>
<p>Традиционные ссылки используются для максимальной совместимости с различными web-серверами и, как следствие, никакие изменения в конфигурации nginx не требуются. Но <a href="http://blog.sjinks.pro/tag/seo/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SEO">SEO</a>&#8217;шники не любят некрасивые ссылки, поэтому в FUDforum встроена «изкоробочная» поддержка красивых ссылок. В простейшем случае при использовании PATHINFO-ссылок для Apache ничего не нужно настраивать — всё работает из коробки, а для nginx нужно приложить некоторые усилия.</p>
<p>Итак, пусть у нас есть такая начальная конфигурация виртуального хоста форума:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p82030">
        <div class="code nginx" id="p820code30">
<span class="kw1">server</span> {<br />
&nbsp; &nbsp; <span class="kw1">server_name</span> forum.site.com;<br />
<br />
&nbsp; &nbsp; <span class="kw1">root</span> /home/site.com/forum;<br />
&nbsp; &nbsp; <span class="kw1">index</span> <span class="kw1">index</span>.php;<br />
<br />
&nbsp; &nbsp; <span class="kw1">location</span> ~ \.php$ {<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_index</span> <span class="kw1">index</span>.php;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_pass</span> unix:/dev/shm/php-fcgi.sock;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_param</span> SCRIPT_FILENAME $document_root$fastcgi_script_name;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">include</span> /etc/nginx/fastcgi_params;<br />
&nbsp; &nbsp; }<br />
}
        </div>
    </div>
</div>

<p>Для того, чтобы добавить поддержку PATHINFO, придётся переписать блок <code>location</code>. Дело в том, что nginx придётся <a href="http://sysoev.ru/nginx/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info" rel="nofollow">явно указывать</a>, где заканчивается имя скрипта и начинается PATHINFO.</p>
<p>Блок <code>location</code> будет выглядеть примерно так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p82031">
        <div class="code nginx" id="p820code31">
&nbsp; &nbsp; <span class="kw1">location</span> ~ ^(.+\.php)(.*)$ {<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_split_path_info</span> ^(.+\.php)(.*)$;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_index</span> <span class="kw1">index</span>.php;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_pass</span> unix:/dev/shm/php-fcgi.sock;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_param</span> SCRIPT_FILENAME $document_root$fastcgi_script_name;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_param</span> PATH_INFO $fastcgi_path_info;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">include</span> /etc/nginx/fastcgi_params;<br />
&nbsp; &nbsp; }
        </div>
    </div>
</div>

<p>Изменилось регулярное выражение в <code>location</code> (так как в случае PATHINFO-ссылок имя php-скрипта будет находиться в середине URL), добавились директивы <code><a href="http://blog.sjinks.pro/tag/fastcgi/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  FastCGI">fastcgi</a>_split_path_info</code> и <code>fastcgi_param PATH_INFO $fastcgi_path_info</code> (первая указывает, как разбить URL на имя скрипта и PATHINFO, вторая передаёт PATHINFO php-скрипту).</p>
<p>Перезапускаем nginx, устанавливаем теме набор шаблонов path_info, перестраиваем тему, получаем красивые ссылки. Но index.php в URL выглядит не очень красиво, было бы неплохо убрать и его.</p>
<p>Это сложнее, но решаемо:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p82032">
        <div class="code nginx" id="p820code32">
<span class="kw1">server</span> {<br />
&nbsp; &nbsp; <span class="kw1">server_name</span> forum.site.com;<br />
<br />
&nbsp; &nbsp; <span class="kw1">root</span> /home/site.com/forum;<br />
&nbsp; &nbsp; <span class="kw1">index</span> <span class="kw1">index</span>.php;<br />
<br />
&nbsp; &nbsp; <span class="kw1">log_not_found</span> <span class="kw2">off</span>;<br />
&nbsp; &nbsp; <span class="kw1">error_page</span> 404 = @forum;<br />
<br />
&nbsp; &nbsp; <span class="kw1">location</span> ~ ^(.+\.php)(.*)$ {<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try_files</span> $uri @forum;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_split_path_info</span> ^(.+\.php)(.*)$;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_index</span> <span class="kw1">index</span>.php;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_pass</span> unix:/dev/shm/php-fcgi.sock;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_param</span> SCRIPT_FILENAME $document_root$fastcgi_script_name;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_param</span> PATH_INFO $fastcgi_path_info;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">include</span> /etc/nginx/fastcgi_params;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; <span class="kw1">location</span> @forum {<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_pass</span> unix:/dev/shm/php-fcgi.sock;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_param</span> SCRIPT_FILENAME $document_root/<span class="kw1">index</span>.php;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">include</span> /etc/nginx/fastcgi_params;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_param</span> PATH_INFO $uri;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_param</span> SCRIPT_NAME /<span class="kw1">index</span>.php;<br />
&nbsp; &nbsp; }<br />
}
        </div>
    </div>
</div>

<p>После этого открываем файл <code>FUDdata/include/compiler.inc</code> (где FUDdata — каталог с внутренними данными форума — задаётся при инсталляции), ищем строку</p>
<p><span class="codebox"><code class="php"><span class="re0">$cmpl</span><span class="br0">&#91;</span><span class="st_h">'ROOT'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st_h">'index.php'</span><span class="sy0">;</span></code></span></p>
<p>изменяем на</p>
<p><span class="codebox"><code class="php"><span class="re0">$cmpl</span><span class="br0">&#91;</span><span class="st_h">'ROOT'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st_h">'.'</span><span class="sy0">;</span></code></span></p>
<p>После чего сохраняем, перестраиваем тему и любуемся красивыми ссылками.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/820-nginx-configuration-fudforum/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/seo/820-nginx-configuration-fudforum/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Googlebot игнорирует &lt;meta name=&#187;robots&#187; content=&#187;noarchive&#187;/&gt;</title>
		<link>http://blog.sjinks.pro/seo/705-googlebot-ignores-noarchive/</link>
		<comments>http://blog.sjinks.pro/seo/705-googlebot-ignores-noarchive/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 01:12:59 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=705</guid>
		<description><![CDATA[У Google свой подход Я на днях поставил эксперимент с целью выяснить, понимает ли Googlebot указание на запрет архивирования страницы (&#60;meta name=&#34;robots&#34; content=&#34;noarchive&#34;/&#62;). Идея заключалась в том, чтобы разрешить поисковикам индексировать контент, доступный не всем пользователям, но при этом не сохранять его в архиве. Это позволило бы сайтам, имеющие защищённые страницы, появляться в результатах поиска [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/705-googlebot-ignores-noarchive/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>У <a href="http://blog.sjinks.pro/tag/google/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Google">Google</a> свой подход</em></h2>
<p>Я на днях поставил эксперимент с целью выяснить, понимает ли Googlebot указание на запрет архивирования страницы (<span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">meta</span> <span class="kw3">name</span><span class="sy0">=</span><span class="st0">&quot;robots&quot;</span> <span class="kw3">content</span><span class="sy0">=</span><span class="st0">&quot;noarchive&quot;</span><span class="sy0">/</span>&gt;</span></code></span>). Идея заключалась в том, чтобы разрешить поисковикам индексировать контент, доступный не всем пользователям, но при этом не сохранять его в архиве. Это позволило бы сайтам, имеющие защищённые страницы, появляться в результатах поиска по релевантному содержимому, но при этом закрывать (возможно, частично) контент от неавторизованных пользователей. Возможно, это не совсем этично, но это не обсуждается.<span id="more-705"></span></p>
<p>Результаты показаны на скриншоте (для просмотра в полном разрешении его нужно кликнуть):</p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2009/11/google-noarchive.png" title="Google и noarchive" rel="lightbox"><img src="http://static.sjinks.info/wp-content/uploads/2009/11/google-noarchive-300x236.png" alt="Google и noarchive" title="Google и noarchive" width="300" height="236" class="size-medium wp-image-706" /></a></p>
<p>Yahoo! Slurp <a href="http://help.yahoo.com/l/us/yahoo/search/indexing/basics-10.html">поддерживает</a> <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">meta</span> <span class="kw3">name</span><span class="sy0">=</span><span class="st0">&quot;robots&quot;</span> <span class="kw3">content</span><span class="sy0">=</span><span class="st0">&quot;noarchive&quot;</span><span class="sy0">/</span>&gt;</span></code></span>, Teoma <a href="http://about.ask.com/en/docs/about/webmasters.shtml#5">тоже</a>, и даже Bing/MSNBot <a href="http://help.live.com/Help.aspx?market=en-US&amp;project=WL_Webmasters&amp;querytype=topic&amp;query=WL_WEBMASTERS_CONC_RestrictAccessToSite.htm">поддерживает</a> данный синтаксис (справедливости ради, я <strong>не проверял</strong>, следуют ли они инструкциям в тэге или нет).</p>
<p>Я очень надеялся, что Googlebot тоже поддерживает подобный синтаксис (и следует инструкциям), но, как видим, нет. Осталось проверить, как он отреагирует на <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">meta</span> <span class="kw3">name</span><span class="sy0">=</span><span class="st0">&quot;googlebot&quot;</span> <span class="kw3">content</span><span class="sy0">=</span><span class="st0">&quot;noarchive&quot;</span><span class="sy0">/</span>&gt;</span></code></span>.</p>
<p></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/705-googlebot-ignores-noarchive/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/seo/705-googlebot-ignores-noarchive/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Показ отрывка вместо статьи на страницах комментариев</title>
		<link>http://blog.sjinks.pro/seo/583-showing-excerpt-instead-of-post-on-paged-comments/</link>
		<comments>http://blog.sjinks.pro/seo/583-showing-excerpt-instead-of-post-on-paged-comments/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 15:48:01 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Советы]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[комментарии]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=583</guid>
		<description><![CDATA[Избавляемся от повторяющегося контента и делаем жизнь диалапщиков легче Прочитав сегодня еще раз статью «Комментатор уже читал пост», решил реализовать описанную Сергеем технику более простым способом. Кроме того, в WordPress 2.7 добавлена поддержка многостраничных комментариев; следуя логике статьи, было бы неплохо показывать отрывок (excerpt) вместо полного текста и для страниц комментариев. Я вижу два способа решения [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/583-showing-excerpt-instead-of-post-on-paged-comments/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Избавляемся от повторяющегося контента и делаем жизнь диалапщиков легче</em></h2>
<p>Прочитав сегодня еще раз статью <strong>«<a href="http://iskariot.ru/development/yet-read/">Комментатор уже читал пост</a>»</strong>, решил реализовать описанную Сергеем технику более простым способом.</p>
<p>Кроме того, в <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> 2.7 добавлена поддержка многостраничных комментариев; следуя логике статьи, было бы неплохо показывать отрывок (excerpt) вместо полного текста и для страниц комментариев.</p>
<p>Я вижу два способа решения поставленной задачи:</p>
<ol>
<li>Изменение шаблона <code>single.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a></code>.</li>
<li>Добавление функции в <code>functions.php</code> темы.</li>
</ol>
<p><span id="more-583"></span></p>
<p>Я начну рассмотрение со второго способа — после него реализация первого способа будет тривиальной.</p>
<p>Начнём со скучной теории (<a href="#skip-boring-theory">skip it</a>).</p>
<p>При использовании разбиения комментариев на страницы, WordPress добавляет переменную <code>cpage</code> в массив <span class="codebox"><code class="php"><span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">query_vars</span></code></span>. Но здесь есть парочка нюансов:</p>
<ol>
<li>На первой странице комментариев (она же может быть последней — всё зависит от настроек WordPress) — той, которая отображается при просмотре статьи — WordPress не устанавливает переменную <code>cpage</code> в номер страницы.</li>
<li>При отправлении комментария (и использовании многостраничных комментариев) WordPress перенаправляет пользователя на страницу с изменившейся постоянной ссылкой: к постоянной ссылке страницы добавляется <code>comment-page-<strong>PAGE</strong>/#comment-<strong>ID</strong></code>. <code>PAGE</code> — это номер страницы комментариев, <code>ID</code> — ID комментария.</li>
<li>Если в постоянной ссылке присутствует параметр <code>comment-page-XXX</code> (он же <code>cpage</code> при отключённом ЧПУ), то WordPress устанавливает переменную <span class="codebox"><code class="php"><span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">query_vars</span><span class="br0">&#91;</span><span class="st_h">'cpage'</span><span class="br0">&#93;</span></code></span> (сюрприз!)</li>
</ol>
<p>Какие из этого можно сделать выводы? Если посетитель просматривает не первую страницу комментариев, либо только что оставил свой комментарий, <span class="codebox"><code class="php"><span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">get</span><span class="br0">&#40;</span><span class="st_h">'cpage'</span><span class="br0">&#41;</span></code></span> вернёт ненулевое значение. В противном случае переменная <span class="codebox"><code class="php"><span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">query_vars</span><span class="br0">&#91;</span><span class="st_h">'cpage'</span><span class="br0">&#93;</span></code></span> не будет установлена. Что и требовалось по условию.</p>
<p>Теперь переходим к отрывку (который excerpt). Плохая новость заключается в том, что многие люди (в том числе и я) его просто не заполняют. Хорошая новость — WordPress (по крайней мере, 2.8; хотя в комментариях к коду написано, что работает, начиная с версии 1.5) умеет его заполнять самостоятельно — это делает функция <span class="codebox"><code class="php">wp_trim_excerpt<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>, которая устанавливается фильтром на событие <code>get_the_excerpt</code>. У этой функции (по сравнению с методом Сергея) есть два недостатка:</p>
<ol>
<li>Она убирает напрочь всю <a href="http://blog.sjinks.pro/tag/html/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTML">HTML</a>-разметку (anybody cares?)</li>
<li>У WordPress своё представление о том, как выглядит знак типографского пропуска (лечится установкой своего фильтра на событие <code>wp_trim_excerpt</code>).</li>
</ol>
<p>Есть одна особенность: вызов функций <span class="codebox"><code class="php">the_excerpt<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>/<span class="codebox"><code class="php">get_the_excerpt<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> из фильтра <code>the_content</code> может привести к рекурсивному вызову этого же фильтра из функции <span class="codebox"><code class="php">wp_trim_excerpt<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>.</p>
<div id="skip-boring-theory"></div>
<p>В <code>functions.php</code> темы добавляем такой код (в WordPress младше 2.8 вместо <span class="codebox"><code class="php">esc_atrr<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> нужно использовать <span class="codebox"><code class="php">attribute_escape<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p58335">
        <div class="code php" id="p583code35">
&nbsp; &nbsp; <span class="kw2">function</span> show_excerpt_on_paged_comments<span class="br0">&#40;</span><span class="re0">$s</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">static</span> <span class="re0">$in_here</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$in_here</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$s</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$in_here</span> <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">global</span> <span class="re0">$wp_query</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$cpage</span> <span class="sy0">=</span> <span class="br0">&#40;</span>int<span class="br0">&#41;</span><span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">get</span><span class="br0">&#40;</span><span class="st_h">'cpage'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$cpage</span> <span class="sy0">&gt;</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$s</span> <span class="sy0">=</span> get_the_excerpt<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'&lt;p&gt;← Вернуться к полной версии записи «&lt;strong&gt;'</span> <span class="sy0">.</span> <span class="kw3">sprintf</span><span class="br0">&#40;</span><span class="st_h">'&lt;a href=&quot;%s&quot;&gt;%s&lt;/a&gt;'</span><span class="sy0">,</span> esc_attr<span class="br0">&#40;</span>get_permalink<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">,</span> get_the_title<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'&lt;/strong&gt;»…&lt;/p&gt;'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$in_here</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$s</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">function_exists</span><span class="br0">&#40;</span><span class="st_h">'add_filter'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; add_filter<span class="br0">&#40;</span><span class="st_h">'the_content'</span><span class="sy0">,</span> <span class="st_h">'show_excerpt_on_paged_comments'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Для тех, кто ждёт первый вариант: в шаблоне <code>single.php</code> заменяем вызов <code>the_content()</code> следующим кодом:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p58336">
        <div class="code php" id="p583code36">
<span class="kw2">&lt;?php</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>int<span class="br0">&#41;</span><span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">get</span><span class="br0">&#40;</span><span class="st_h">'cpage'</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">echo</span> get_the_excerpt<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'&lt;p&gt;← Вернуться к полной версии записи «&lt;strong&gt;'</span> <span class="sy0">.</span> <span class="kw3">sprintf</span><span class="br0">&#40;</span><span class="st_h">'&lt;a href=&quot;%s&quot;&gt;%s&lt;/a&gt;'</span><span class="sy0">,</span> esc_attr<span class="br0">&#40;</span>get_permalink<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">,</span> get_the_title<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'&lt;/strong&gt;»…&lt;/p&gt;'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; the_content<span class="br0">&#40;</span><span class="st0">&quot;Далее…&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="sy1">?&gt;</span>
        </div>
    </div>
</div>

<p>В принципе, вариант №2 (тот, который был рассмотрен первым) при желании можно реализовать в виде плагина.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/583-showing-excerpt-instead-of-post-on-paged-comments/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/seo/583-showing-excerpt-instead-of-post-on-paged-comments/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Глобальный nofollow для страниц комментариев</title>
		<link>http://blog.sjinks.pro/seo/579-global-nofollow-for-comment-pages/</link>
		<comments>http://blog.sjinks.pro/seo/579-global-nofollow-for-comment-pages/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 06:44:37 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Советы]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[комментарии]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=579</guid>
		<description><![CDATA[Еще один способ прятать ссылки от поисковиков Идеально для SEOшников, использующих разбиение комментариев на страницы: глобальный запрет следования по ссылкам для всех страниц комментариев, кроме первой (или последней, в зависимости от настроек WordPress). В шаблон header.php добавляем такой вот код: &#60;?php if ($wp_query-&#62;get(&#039;cpage&#039;)) : ?&#62; &#60;meta name=&#34;robots&#34; content=&#34;index,nofollow&#34;/&#62; &#60;?php endif; ?&#62; Работает для WordPress 2.7 и [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/579-global-nofollow-for-comment-pages/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Еще один способ прятать ссылки от поисковиков</em></h2>
<p>Идеально для SEOшников, использующих разбиение комментариев на страницы: глобальный запрет следования по ссылкам для всех страниц комментариев, кроме первой (или последней, в зависимости от настроек <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a>).<span id="more-579"></span></p>
<p>В шаблон <code>header.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a></code> добавляем такой вот код:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p57938">
        <div class="code php" id="p579code38">
<span class="kw2">&lt;?php</span> <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">get</span><span class="br0">&#40;</span><span class="st_h">'cpage'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="sy1">?&gt;</span><br />
&nbsp; &nbsp; <span class="sy0">&lt;</span>meta name<span class="sy0">=</span><span class="st0">&quot;robots&quot;</span> content<span class="sy0">=</span><span class="st0">&quot;index,nofollow&quot;</span><span class="sy0">/&gt;</span><br />
<span class="kw2">&lt;?php</span> <span class="kw1">endif</span><span class="sy0">;</span> <span class="sy1">?&gt;</span>
        </div>
    </div>
</div>

<p>Работает для WordPress 2.7 и старше.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/579-global-nofollow-for-comment-pages/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/seo/579-global-nofollow-for-comment-pages/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>WordPress, FastCGI и редирект 301</title>
		<link>http://blog.sjinks.pro/wordpress/510-wordpress-fastcgi-and-301-redirect/</link>
		<comments>http://blog.sjinks.pro/wordpress/510-wordpress-fastcgi-and-301-redirect/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 16:31:18 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[nginx]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[FastCGI]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[redirect]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=510</guid>
		<description><![CDATA[Как заставить WordPress посылать код 301 при использовании FastCGI Всё-таки удивительная штука WordPress… Сегодня чисто случайно обнаружил, что если PHP работает в режиме FastCGI (например, связка WordPress + nginx + PHP), то все редиректы с кодом 301 (Permanent Redirect) превращаются в редиректы с кодом 302 (Temporary Redirect). Чем это грозит? Если Вы занимаетесь спамомSEO, то Вы, вероятно, знаете, что переход с [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/510-wordpress-fastcgi-and-301-redirect/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Как заставить <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> посылать код 301 при использовании <a href="http://blog.sjinks.pro/tag/fastcgi/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  FastCGI">FastCGI</a></em></h2>
<p>Всё-таки удивительная штука WordPress… Сегодня чисто случайно обнаружил, что если <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a> работает в режиме FastCGI (например, связка WordPress + <a href="http://blog.sjinks.pro/tag/nginx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  nginx">nginx</a> + PHP), то все редиректы с кодом 301 (Permanent <a href="http://blog.sjinks.pro/tag/redirect/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  redirect">Redirect</a>) превращаются в редиректы с кодом 302 (Temporary <a href="http://blog.sjinks.pro/tag/redirect/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  redirect">Redirect</a>).</p>
<p>Чем это грозит? Если Вы занимаетесь <del datetime="2009-03-05T16:07:27+00:00">спамом</del><a href="http://blog.sjinks.pro/tag/seo/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SEO">SEO</a>, то Вы, вероятно, знаете, что переход с кодом 302 <a href="http://www.searchmasters.co.nz/articles/97/do-302-redirects-pass-google-pr/">не передаёт PageRank</a>. Иными словами, если Вы изменили структуру пермалинков или по той или иной причине в <a href="http://blog.sjinks.pro/tag/google/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Google">Google</a> "раскручена" страница с несколько другой постоянной ссылкой (например, &#x0068;ttp://example.com/?p=202), то «канонический редирект» (см. <span class="codebox"><code class="text">wp-includes/canonical.php</code></span>) не передаст PageRank целевой странице.<span id="more-510"></span></p>
<p>Еще раз повторюсь, это актуально только в случае использования PHP в режиме FastCGI (и для IIS, но это оффтопик).</p>
<p>Есть два способа решения проблемы:</p>
<ol>
<li>Написание плагина, реализующего свой вариант <span class="codebox"><code class="php">wp_redirect<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> (функция <span class="codebox"><code class="php">wp_redirect<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> определена в <code>wp-includes/pluggable.php</code>, что даёт возможность её переопределения);</li>
<li>Изменение кода <span class="codebox"><code class="php">wp_redirect<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> в <code>wp-includes/pluggable.php</code></li>
</ol>
<p>Я рассмотрю только второй вариант.</p>
<p>В оригинале функция <span class="codebox"><code class="php">wp_redirect<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> выглядит следующим образом:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p51041">
        <div class="code php" id="p510code41">
<span class="kw2">function</span> wp_redirect<span class="br0">&#40;</span><span class="re0">$location</span><span class="sy0">,</span> <span class="re0">$status</span> <span class="sy0">=</span> 302<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">global</span> <span class="re0">$is_IIS</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$location</span> <span class="sy0">=</span> apply_filters<span class="br0">&#40;</span><span class="st_h">'wp_redirect'</span><span class="sy0">,</span> <span class="re0">$location</span><span class="sy0">,</span> <span class="re0">$status</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$status</span> <span class="sy0">=</span> apply_filters<span class="br0">&#40;</span><span class="st_h">'wp_redirect_status'</span><span class="sy0">,</span> <span class="re0">$status</span><span class="sy0">,</span> <span class="re0">$location</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="sy0">!</span><span class="re0">$location</span> <span class="br0">&#41;</span> <span class="co1">// allows the wp_redirect filter to cancel a redirect</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw4">false</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$location</span> <span class="sy0">=</span> wp_sanitize_redirect<span class="br0">&#40;</span><span class="re0">$location</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="re0">$is_IIS</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Refresh: 0;url=<span class="es4">$location</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw3">php_sapi_name</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st_h">'cgi-fcgi'</span> <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; status_header<span class="br0">&#40;</span><span class="re0">$status</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// This causes problems on IIS and some FastCGI setups</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Location: <span class="es4">$location</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Всё, что требуется — закомментировать строку <span class="codebox"><code class="php"><span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw3">php_sapi_name</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st_h">'cgi-fcgi'</span> <span class="br0">&#41;</span></code></span>. При этом не забываем прочитать комментарий разработчиков: <q>This causes problems on IIS and some FastCGI setups</q>.</p>
<p>Должно получиться что-то вида:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p51042">
        <div class="code php" id="p510code42">
<span class="kw2">function</span> wp_redirect<span class="br0">&#40;</span><span class="re0">$location</span><span class="sy0">,</span> <span class="re0">$status</span> <span class="sy0">=</span> 302<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">global</span> <span class="re0">$is_IIS</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$location</span> <span class="sy0">=</span> apply_filters<span class="br0">&#40;</span><span class="st_h">'wp_redirect'</span><span class="sy0">,</span> <span class="re0">$location</span><span class="sy0">,</span> <span class="re0">$status</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$status</span> <span class="sy0">=</span> apply_filters<span class="br0">&#40;</span><span class="st_h">'wp_redirect_status'</span><span class="sy0">,</span> <span class="re0">$status</span><span class="sy0">,</span> <span class="re0">$location</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="sy0">!</span><span class="re0">$location</span> <span class="br0">&#41;</span> <span class="co1">// allows the wp_redirect filter to cancel a redirect</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw4">false</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$location</span> <span class="sy0">=</span> wp_sanitize_redirect<span class="br0">&#40;</span><span class="re0">$location</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="re0">$is_IIS</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Refresh: 0;url=<span class="es4">$location</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
<span class="co1">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( php_sapi_name() != 'cgi-fcgi' )</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; status_header<span class="br0">&#40;</span><span class="re0">$status</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// This causes problems on IIS and some FastCGI setups</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Location: <span class="es4">$location</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Не забываем сохранить файл, после чего редиректы с кодом 301 останутся редиректами с кодом 301 <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><strong style="color: red">UPDATE:</strong> для nginx есть лучший способ: <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a> <strong><a href="http://blog.sjinks.pro/wordpress/plugins/539-nginx-compatibility-making-wordpress-friendly-to-nginx/">nginx Compatibility</a></strong>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/510-wordpress-fastcgi-and-301-redirect/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/510-wordpress-fastcgi-and-301-redirect/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>

