Gravのsitemapを拡張子.xmlに統一

/ Grav

GravのプラグインSitemapでは/sitemapからも/sitemap.xmlからもサイトマップにアクセスできるようになっている。これを後者のみからアクセス可能にする場合は/sitemap/sitemap.xmlに301リダイレクトする必要があるが、この方法についてプラグインのREADMEでは.htaccessを編集するように書かれている。

Gravそのものにもリダイレクトの機能がありながら.htaccessを編集しなければならない選択肢しか用意されていないのはあきらかに異常な状態だろう。リダイレクトの需要があることをREADMEで把握しているならばプラグインのオプションでその項目を用意すべきだ。

ここでは譲歩してAdmin Panelからこの設定を行う方法と注意点を紹介する。Grav公式のRoutingのドキュメントによれば、user/config/site.yamlにおいて次のように編集すれば目的は達成できそうだ。

#not work!
redirects:
        /sitemap: /sitemap.xml

実行すればわかるだろう。この方法は失敗する。ブラウザは301リダイレクトが繰り返し行われることによる警告を発するだろう。警告を押してサイトを表示するとアドレスバーは次のようになっている。

https://yoursite.com/sitemap.xml.xml.xml.xml.xml.xml.xml.xml.xml.xml.xml.xml.xml.xml

だいたい理由はわかった。ブラウザの言う通りだった。Routingのドキュメントによると、リダイレクト元のURLでは正規表現が使えるようだ。/sitemapという正規表現は/sitemap.xmlにもマッチしてしまうため、リダイレクト元の文字列がそのままphpのpreg_matchなどのパターンに渡されているということが想像できる。したがって次のように変更すると転送設定はうまくワークする。

#work!
redirects:
        /sitemap$: /sitemap.xml

正規表現を知っているものには説明不要だが、$は文字列の終わりを表す記号で、/sitemap$/sitemal.xmlにはマッチしない。以上はYamlの形式で示しているがAdmin Panelからも簡単に行える設定だ。Configuration>Siteの下の方にこの項目はある。

この無限ループは想定できることで、Gravの実装で自動的に$を付与すべきだ。そもそもがsitemapプラグインが自分でリダイレクトの設定を用意すればよいのだがそれを補うためのGravの機能にも問題が発覚したことを記録のために残しておく。このリダイレクトは最近追加された機能というわけでもないがなぜ放置されているのかがわからない(sitemapのオプション対応もそうだが)。