164ab5140SAndreas Gohr<?php 264ab5140SAndreas Gohr 364ab5140SAndreas Gohrnamespace dokuwiki\Action; 464ab5140SAndreas Gohr 564ab5140SAndreas Gohruse dokuwiki\Action\Exception\FatalException; 6b6c12ffaSAndreas Gohruse dokuwiki\Sitemap\Mapper; 779a2d784SGerrit Uitslaguse dokuwiki\Utf8\PhpString; 864ab5140SAndreas Gohr 9ab583a1bSAndreas Gohr/** 10ab583a1bSAndreas Gohr * Class Sitemap 11ab583a1bSAndreas Gohr * 12ab583a1bSAndreas Gohr * Generate an XML sitemap for search engines. Do not confuse with Index 13ab583a1bSAndreas Gohr * 14ab583a1bSAndreas Gohr * @package dokuwiki\Action 15ab583a1bSAndreas Gohr */ 168c7c53b0SAndreas Gohrclass Sitemap extends AbstractAction 178c7c53b0SAndreas Gohr{ 1864ab5140SAndreas Gohr /** @inheritdoc */ 19*d868eb89SAndreas Gohr public function minimumPermission() 20*d868eb89SAndreas Gohr { 2164ab5140SAndreas Gohr return AUTH_NONE; 2264ab5140SAndreas Gohr } 2364ab5140SAndreas Gohr 2464ab5140SAndreas Gohr /** 2564ab5140SAndreas Gohr * Handle sitemap delivery 2664ab5140SAndreas Gohr * 2764ab5140SAndreas Gohr * @author Michael Hamann <michael@content-space.de> 2864ab5140SAndreas Gohr * @throws FatalException 2964ab5140SAndreas Gohr * @inheritdoc 3064ab5140SAndreas Gohr */ 31*d868eb89SAndreas Gohr public function preProcess() 32*d868eb89SAndreas Gohr { 3364ab5140SAndreas Gohr global $conf; 3464ab5140SAndreas Gohr 3564ab5140SAndreas Gohr if ($conf['sitemap'] < 1 || !is_numeric($conf['sitemap'])) { 366c8673feSAndreas Gohr throw new FatalException('Sitemap generation is disabled', 404); 3764ab5140SAndreas Gohr } 3864ab5140SAndreas Gohr 39b6c12ffaSAndreas Gohr $sitemap = Mapper::getFilePath(); 40b6c12ffaSAndreas Gohr if (Mapper::sitemapIsCompressed()) { 4164ab5140SAndreas Gohr $mime = 'application/x-gzip'; 4264ab5140SAndreas Gohr } else { 4364ab5140SAndreas Gohr $mime = 'application/xml; charset=utf-8'; 4464ab5140SAndreas Gohr } 4564ab5140SAndreas Gohr 4664ab5140SAndreas Gohr // Check if sitemap file exists, otherwise create it 4764ab5140SAndreas Gohr if (!is_readable($sitemap)) { 48b6c12ffaSAndreas Gohr Mapper::generate(); 4964ab5140SAndreas Gohr } 5064ab5140SAndreas Gohr 5164ab5140SAndreas Gohr if (is_readable($sitemap)) { 5264ab5140SAndreas Gohr // Send headers 5364ab5140SAndreas Gohr header('Content-Type: ' . $mime); 5479a2d784SGerrit Uitslag header('Content-Disposition: attachment; filename=' . PhpString::basename($sitemap)); 5564ab5140SAndreas Gohr 5664ab5140SAndreas Gohr http_conditionalRequest(filemtime($sitemap)); 5764ab5140SAndreas Gohr 5864ab5140SAndreas Gohr // Send file 5964ab5140SAndreas Gohr //use x-sendfile header to pass the delivery to compatible webservers 6064ab5140SAndreas Gohr http_sendfile($sitemap); 6164ab5140SAndreas Gohr 6264ab5140SAndreas Gohr readfile($sitemap); 6364ab5140SAndreas Gohr exit; 6464ab5140SAndreas Gohr } 6564ab5140SAndreas Gohr 666c8673feSAndreas Gohr throw new FatalException('Could not read the sitemap file - bad permissions?'); 6764ab5140SAndreas Gohr } 6864ab5140SAndreas Gohr} 69