記事一覧

サイト移転時のリダイレクト関連のメモ

.htaccessとか

少し早めに「Nikola Tesla Center」から「SiReFaSo」への移転作業をしていました。師走にバタバタするのも何なので、余裕のあるうちに。

.htaccessでリダイレクトすればいいんだろーとタカを括っていたのですが、land.toサーバでは何か色々制限があって使えない記述があったりで苦労しました。後半でsitemixサーバについても触れてみます。

やりたいこと

「 http://nikola.ps.land.to/ntc/ 」およびそれ以下のディレクトリへのアクセスを「 http://sirefaso.appspot.com/ 」以下へマッピングさせる。ただし、「 http://nikola.ps.land.to/ntc/plugin/ntcmanager/ 」を除く。

pluginディレクトリ以下にはpluginの更新用ファイルが入っていて、起動時の更新の確認やネットワーク更新でアクセスがあるのですが、これはSiReFaSoに転送されても困るので。

普通に301リダイレクト

最初に書いたのはこんな感じのものです。

Redirect permanent /ntc/ http://sirefaso.appspot.com/

これで /ntc/ ディレクトリ以下に対するアクセスは全てSiReFaSoにマッピングされて転送されますが、plugin以下へのアクセスも転送されてしまいます。

RewriteRuleを使う

次に書いたのがこんな感じのものです。

RewriteEngine on
RewriteRule ^/ntc/((?!plugin).)*$ http://sirefaso.appspot.com/$1 [R=301]
RewriteEngine off

正規表現でpluginディレクトリだけを例外として、 /ntc/ ディレクトリ以下に対するアクセスをSiReFaSoにマッピングできます。

ローカルのApacheでは転送できたのですが、 land.to で試したら 500 Internal Server Error になりました。よくわかりませんが、使えないっぽいです。

RedirectMatchを使う

最初に書いたRedirectの親戚でしょうか、正規表現を使う書き方もできるんですね。

RedirectMatch permanent ^/ntc/((?!plugin).)*$ http://sirefaso.appspot.com/$1

これもローカルのApacheでは転送できたのですが、 land.to で試したら 500 Internal Server Error になりました。

下位ディレクトリであらためて.htaccess指定で上書きする

もうこれしか思いつきませんでした。 /ntc/ ディレクトリの.htaccessには最初に書いた通りにし、 /ntc/plugin/ntcmanager/ ディレクトリに.htaccessを置いて以下のように設定します。

Redirect gone /ntc/plugin/ntcmanager/

リダイレクトさえしなければ200を返しても構わないと思っていましたが、上位ディレクトリの指定をRedirectで上書きする必要があったので、もう更新しないしいっそ410 Goneでよかろう、という判断です。これでplugin更新問い合わせはSiReFaSoには来なくなりました。

ついでにsitemixについて

sitemixにある「ついっとゅう」の配布ページも移転したのでリダイレクトさせたいのですが、こちらは.htaccessそのものが使えません。PHPが使えるのでそれでなんとかしてみます。

http://nikola.sitemix.jp/twittyu/ へのアクセスのみで良いので、とりあえずindex.phpを作成して以下のように書きます。

<?php
header('HTTP/1.1 301 Moved Permanently'); 
header('Location: http://midolaso.appspot.com/tw/twittyu/'); 
?>

そしてindex.htmlを削除します。これが残っていると優先的に表示されてしまうので。これで転送されるようになりました。

301と302の違い?「移転しました」じゃダメなの?

上記では 301 Moved Permanently を使用しています。これは恒久的な転送という意味です。302 Found は一時的な転送。「べ、別に移転したわけじゃないんだからねっ!一時的なものなんだからっ!」という旨をGoogleさんに伝えるときは302を使います。

「移転しました」と書いたHTMLファイルをアップしただけでは 200 OK を返し続けることになるのでGoogleさんには移転のお知らせは伝わりません。移転するときは 301 Moved Permanently を返すのがWebに優しいエチケットみたいなものです。

HTML5でinputのpattern属性とCSS

pattern属性

HTML5ではinputにpattern属性というのがあって、送信前に入力値を正規表現でチェックして制限できる。Operaなどは既にこの仕様に対応している。

<input type="text" name="postcode" value="" pattern="\d{3}-\d{4}" />

これは聞いたことがあったので、SoSiReMiでも使っているのだけれど、入力値の状態をCSSで感知できるというのを昨日知った。

以下で実際に試してみた。Opera, Safari, Google Chromeで入力値に応じて表示が変わる。Firefoxは3.6.11では対応していなかったので4に期待。

JavaScript無しでも色んなことができるようになって便利(その分覚えることが多いけど)。

続きを読む

RSS 1.0とは何だったのか

RSS 1.0におけるrdf:aboutとかlinkにまつわるあれこれ

久々にお勉強エントリ。

きっかけは、SiReFaSoValidation Checkにかけてみて引っ掛かってしまったため。HTML5の文法チェックのつもりで、HTML自体はValidだったのだけれども、RSSがInvalidと判定されてしまった。(CSSもInvalidなのだけれども、モダンブラウザのCSS3先行実装などを利用しているためそこは諦めている。早く仕様が固まってprefix取れるといいな。)

引っ掛かったのはRSS 1.0。item要素のrdf:aboutの属性値が他のitem要素のものと被ってる、とのこと(rdf:aboutはユニークでないといけない)。以下はこのblogのRSSの一部。個別記事にはユニークなURLが割り当てられている。

<item rdf:about="http://home.384.jp/evidence/cgi-bin/archives/84.html">
<title>SiReFaSo更新</title>
<link>http://home.384.jp/evidence/cgi-bin/archives/84.html</link>
<description>SiReFaSo更新
今までNTCのデータをコピーしてるだけでしたが、NTCのデータが飛んだ時に共倒れとなってしまうので、単独で巡回・更新捕捉出来るようにしました。
SiReFaSo - 伺かゴースト更新フィード
新規登録ゴーストを @sirefa...</description>
<dc:date>2010-06-13T17:38:00+09:00</dc:date>
</item>

SiReFaSoは他にRSS 2.0とAtom 1.0を出力しているがそちらはValid。この2つは既存のPythonのライブラリを使っているので仕様をあまり知らないまま出力してるけれども変なことにはなっていない。問題はRSS 1.0で、これを出力するPythonのライブラリをかなり頑張って探したのだけれども見つからなくて、自分でテンプレートを書いて出力している。元になっているのはNTCのRSS 1.0(こちらはPHPのライブラリを使って出力している)。

本当はSiReFaSoではRSS 1.0は捨てようと思っていた。あえて自分で書いてまで出力しているのは単にNTCとの互換性を保持するため。しかし泣き言を言っても始まらないのでどう修正したものか考えてみた。

rdf:aboutには何を書くべきか

今まではrdf:aboutにゴーストの配布元サイトのURLを書いていた。RSSリーダーで購読する場合もリンク先には配布元を指定して直接飛べる方が便利だろう。しかし同一作者のゴーストが複数あった場合、配布元サイトURLは同じである場合が多い。これによって同一URIを複数itemのrdf:aboutに指定してしまい、Invalidとなっていた。

rdf:aboutはitem毎にユニークでなければならない。SiReFaSoに登録されているゴースト毎にユニークなキーはhomeurlだけだ(ゴースト名は重複を許容している)。つまりrdf:aboutにはhomeurlを指定するのが相応しい。でもちょっと待って。RSSリーダーで購読する際にhomeurlに飛ばされても誰も幸せにならない。大抵は404 Not Foundだ。GHOSTのルートフォルダにindex.htmlを入れてる人なんてそうはいない。てか、そこは配布ページじゃない。

ここで更なる疑問を抱く。item要素のrdf:about属性には一般的にURLを記述するが、item内にもlink要素というものを指定する。普通はrdf:aboutと同じURLを記述するようだが、異なっていても構わないらしい(互換性のために残された仕様?RSS 2.0にもlink要素がある)(そしてこれはユニークである必要がない)。一般的なRSSリーダーはどっちを読むのだろう?自分が作るとしたらRSS 2.0互換を考えてlink要素を優先するだろうなぁ、などと考えながらとりあえずRSS 1.0でrdf:aboutとlink要素にそれぞれ違うURLを指定してそのXMLをIE8、Firefox3.6.8、Opera10.60で表示してみた。以下がその結果。

  • IE8: link要素のURLを使用
  • Firefox3.6.8: link要素のURLを使用
  • Opera10.60: link要素のURLを使用

rdf:aboutはユニークであれば何でもいい、という結論。でもhomeurlを指定するのはやはり抵抗がある。rdf:aboutを使って何かするエージェントがいないとも限らないし…。

RSSのitemのlinkに他所様のURLを指定するのでなく、自分のサイトの構造を定義してマークアップできたらベストだろうか。SiReFaSoにはゴースト毎の個別ページを実装すべきだったかもしれない。とりあえずゴースト名で検索した結果のページのURLをrdf:aboutに指定することにする。一般的なRSSリーダーはlink要素を読むだろうから今まで通り利便性は損なわれないし、仮にrdf:aboutを読んで検索結果に飛ばされてもあらためて配布元へのリンクが示されたページを拝めるし、rdf:aboutはユニークになる(ゴースト名の重複は許容しているけどゴーストマスタの良心を信じることにする)。

他のサイトはどうしてる?

マッシュアップ系のサイトでは同じような問題を抱えているのではないだろうか。RSS 1.0を配信している他所様のサイトもValidation Checkしてみた。

自分のサイト内の記事であればパーマリンクもユニークだろうけど、やはりというか、他所のリンク集的なものや自由投稿形式のものはURI被りまで想定していないようだ。ちなみにいずれもrdf:about属性とlink要素内テキストは同一のURLが指定されていた。あえて別々のURLを指定するのも今回のような特殊な事情が無い限りするべきではないかもしれない。

ページ移動