phoenix で sitemap.xml を返せるようにする

Elixir Phoenix Web
更新2020/10/31
クローラー用に sitemap.xml を動的に生成したいやつです。

結論

artcileという要素のsitemapを作るのであれば、
router.ex
get "/sitemap.xml", HogeController, :sitemap
contorllerに下記みたいな感じで追加
def sitemap(conn, _param) do
  articles = Articles.list_article()

  conn
  |> put_resp_content_type("application/xml")
  |> render("sitemap.xml", articles: articles)
end
sitemap.xml.eex
(
※Calendarが入ってない場合はdepsに追加する必要あり)
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>https://aqualamp.org/</loc>
        <lastmod>2020-10-31</lastmod>
        <changefreq>weekly</changefreq>
        <priority>0.5</priority>
    </url>
    <%= for article <- @articles do %>
    <url>
        <loc><%= Routes.article_url(@conn, :show, article)  %></loc>
        <% {:ok,date_text} = Calendar.Strftime.strftime(article.updated_at,"%Y-%m-%d") %>
        <lastmod><%= date_text %></lastmod>
        <priority>1.0</priority>
    </url>
    <% end %>
</urlset>
みたいにやるとできた。

余談

 put_resp_content_type("application/xml")がなくてもChoromeではあたかも動いてるように見えた。おそらくクローラーはChromeよりも繊細だと思うので入れておいたほうが良いかもしれない。

MIX_ENV=prdだと一度sitemapを表示させたあと、sitemap.xml.eexを編集してもなぜか結果が更新されない。
ただし、新しいartcileをcreateしたときには更新されていたので、実害はなさそうだった。でも謎。
CloudFrontとかnginxとかブラウザとかで意図しないキャッシュが効いてるのかとも思ったがそうでもなさそう。phoenix自体にリクエストは到達していて200を返しているのに....。調査中。

書いた人/このブログについて

サーバーサイドエンジニア。お仕事ではRubyとPerl。趣味ではC#やHLSLなどを少しと、3DCGでPythonをごまかしながら使う感じ。Unityとインフラ周りも好き。

自分の備忘録もGoogle検索に任せたくてこのブログ書いてる。Phoenix製でEC2上で稼働中。