xref: /dokuwiki/inc/Action/Sitemap.php (revision d4f83172d9533c4d84f450fe22ef630816b21d75)
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