xref: /dokuwiki/inc/Action/Sitemap.php (revision 2bb340bc5aadeed026747a459c8bfdfdab267e4a)
1<?php
2
3namespace dokuwiki\Action;
4
5use dokuwiki\Action\Exception\FatalException;
6
7/**
8 * Class Sitemap
9 *
10 * Generate an XML sitemap for search engines. Do not confuse with Index
11 *
12 * @package dokuwiki\Action
13 */
14class Sitemap extends AbstractAction {
15
16    /** @inheritdoc */
17    public function minimumPermission() {
18        return AUTH_NONE;
19    }
20
21    /**
22     * Handle sitemap delivery
23     *
24     * @author Michael Hamann <michael@content-space.de>
25     * @throws FatalException
26     * @inheritdoc
27     */
28    public function preProcess() {
29        global $conf;
30
31        if($conf['sitemap'] < 1 || !is_numeric($conf['sitemap'])) {
32            throw new FatalException('Sitemap generation is disabled', 404);
33        }
34
35        $sitemap = \Sitemapper::getFilePath();
36        if(\Sitemapper::sitemapIsCompressed()) {
37            $mime = 'application/x-gzip';
38        } else {
39            $mime = 'application/xml; charset=utf-8';
40        }
41
42        // Check if sitemap file exists, otherwise create it
43        if(!is_readable($sitemap)) {
44            \Sitemapper::generate();
45        }
46
47        if(is_readable($sitemap)) {
48            // Send headers
49            header('Content-Type: ' . $mime);
50            header('Content-Disposition: attachment; filename=' . utf8_basename($sitemap));
51
52            http_conditionalRequest(filemtime($sitemap));
53
54            // Send file
55            //use x-sendfile header to pass the delivery to compatible webservers
56            http_sendfile($sitemap);
57
58            readfile($sitemap);
59            exit;
60        }
61
62        throw new FatalException('Could not read the sitemap file - bad permissions?');
63    }
64
65}
66