ローカル環境(ラズベリーパイ)で、WordPressを使わずにHTML(厳密にはPHP)で書いてサイトを作っているのですが、サイトマップXMLをPHPで出力して自動化したいと考えました。
環境
- RaspberryPi
- Apache:2.4.25
- PHP:7.0.33
拡張子xmlの「sitemap.xml」をPHPで実行
ページのURL一覧をcsvに書いて、それをPHPで処理して「sitemap.xml」に出力します。
csv
/URL1,タイトル1
/URL2,タイトル2
/URL3,タイトル3
サイトのページタイトルをCSVを読み込んで表示させているのですが、同じcsvを使ってサイトマップも出力したら、ページの追加や更新で「sitemap.xml」を編集しなくて済みます。
PHPは拡張子「html」で実行してるので.htaccessに「.xml」を書き足すだけでした。
.htaccess
AddType application/x-httpd-php .php .html .xml
ブラウザで表示を確認。
![PHPで出力したsitemap.xml](https://coronblog.kanazawacycleparking.jp/wp-content/uploads/2019/11/20191128151755.png)
テキストが表示されるが色分けされていない。ソースも確認してみる。
sitemap.xml
<?xml version="1.0" encoding="UTF-8" ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>
/
</loc>
<lastmod>
2019-11-28T09:30:26+09:00
</lastmod>
<priority>0.8</priority></url>
<url>
<loc>
/cycling-road/saigawa-cycling/
</loc>
<lastmod>
2019-11-28T09:30:20+09:00
</lastmod>
<priority>0.8</priority></url>
</urlset>
ソースは問題なさそうに見えるが、sitemap.xmlの表示が色分けされていないのに違和感。
sitemap.xmlの書き方はこちらを参考。
![](https://murashun.jp/img/ogp.png)
そこで、.htaccessに「.xml」を削除した。
.htaccess
AddType application/x-httpd-php .php .html
ブラウザでの表示で色が変わったがPHPで書いた文もそのまま表示される。
[<?php print(‘hogehoge’);) ?>]
これでは意味がない。
調べていたらHTTPヘッダーが「text/xml」になっている必要があるのが分かった。
![](https://goma.pw/article/data/images/2015-03-17-0/main.png)
Chromeのデベロッパーツールでヘッダー確認。
![デベロッパーツールでHTTPヘッダー確認](https://coronblog.kanazawacycleparking.jp/wp-content/uploads/2019/11/20191128151740.png)
案の定、[Contents-Type:text/html]になっている。なので、参考にした上記サイトの方法を試して「.htaccess」を編集したが、[text/html]のまま変わらず。
そこで、PHPでHTTPヘッダーを設定できないか、また調べてみる。
HTTPヘッダーをxmlに変えるを参考。.htaccessは最初の「AddType application/x-httpd-php .php .html .xml」の状態に戻した。
php
header("Content-Type: text/xml");
header("Content-Disposition: inline");
これで表示確認。
![PHPで出力したsitemap.xmlを表示](https://coronblog.kanazawacycleparking.jp/wp-content/uploads/2019/11/20191128151804.png)
![sitemap.xmlのHTTPヘッダー確認](https://coronblog.kanazawacycleparking.jp/wp-content/uploads/2019/11/20191128151813.png)
Contents-Typeが[text/xml]に変わった。
まとめ
単純に拡張子がxmlでいいのかと思いましたが、HTTPヘッダーのContents-Typeも「xml」に設定しないと駄目でしたね。
PHPなら「header」関数で設定できます。