«前の日記(2014-07-01) 最新 次の日記(2014-07-07)» 編集

meta's blog - The Power To Serve

筆者について

FreeBSDを通じてOSSにささかな貢献を。

OSS活動をご支援いただける方を募集しています


2014-07-02 tDiary の個別記事の URL を静的ページに見せかけたい

tDiary の個別記事の URI を静的ページに見せかけたい

タイトルの通りです。

tDiary はすべてのページを動的に生成し、/tdiary/?date=20140702 といったリクエスト URI でアクセスしますが、これを /tdiary/20140702.html という URI でアクセス出来るようにしたい。詳細な要件はこんな感じ。

  • /tdiary/20140702.html という URI でアクセス出来るようにしたい
  • 従来の URI /tdiary/?date=20140702 は /tdiary/20140702.html にリダイレクトしたい

tDiary-users wiki - htmlでアクセスしたいを参考に .htaccess に mod_rewrite の設定を行い、前者は実現出来るようになりました。 後者の設定は、一見リダイレクトがループするように見えますが以下の設定で実現できました。

tDiary の設置してあるディレクトリに .htaccess を置いてその中に設定を定義したため、VirtualHost ディレクティブの中に書く場合は細部のパスが異なります。

RewriteEngine On
# YYYYMMDD.html でアクセスできるようにする
RewriteRule ^([0-9]+)\.html$ index.rb?date=$1 [L]
# /tdiary/?date=YYYYMMDD でアクセスしてきたら
# YYYYMMDD.html にリダイレクトする
RewriteCond %{REQUEST_URI} !index\.rb
RewriteCond %{QUERY_STRING} date=([0-9]+)
RewriteRule ^ /tdiary/%1.html? [R=307,L]

この設定だと /tdiary/index.rb?date=20140702 という URI できたアクセスはリダイレクトされずそのままになりますが、ループを回避するために致し方ないのと、アクセスログを見てもほとんどこの形式でのアクセスはないので目をつぶることに。

  • ?date=YYYYMMDD → YYYYMMDD.html にリダイレクト (ブラウザの URI も変わる)
  • YYYYMMDD.html → index.rb?date=YYYYMMDD に(内部的に)転送 (ブラウザの URI はそのまま)
  • index.rb?date=YYYYMMDD → そのまま

こんなイメージで。ここの URI も http://w.vmeta.jp/tdiary/?date=20140702 にアクセスすると http://w.vmeta.jp/tdiary/20140702.html にリダイレクトされるようになっています。

ただ、思わぬ副作用があるかもしれないので現状は 307 で一時的にリダイレクト。しばらく運用してみて問題がなければ 301 に変更します。

2014/07/06 12:50 追記

案の定副作用があって、前n日分のリンクがうまく動いていなかったので下記のように修正しました。

$ git diff
diff --git a/.htaccess b/.htaccess
index 4b4670d..9a34848 100644
--- a/.htaccess
+++ b/.htaccess
@@ -21,10 +21,10 @@ DirectoryIndex index.rb

 RewriteEngine On
 # YYYYMMDD.html でアクセスできるようにする
-RewriteRule ^([0-9]+)\.html$ index.rb?date=$1 [L]
+RewriteRule ^([0-9]+-?[0-9]+)\.html$ index.rb?date=$1 [L]

 # /tdiary/?date=YYYYMMDD でアクセスしてきたら
 # YYYYMMDD.html にリダイレクトする
 RewriteCond %{REQUEST_URI} !index\.rb
-RewriteCond %{QUERY_STRING} date=([0-9]+)
+RewriteCond %{QUERY_STRING} date=([0-9]+-?[0-9]+)
 RewriteRule ^ /tdiary/%1.html? [R=307,L]