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のオプション対応もそうだが)。