rNote のオリジナルコードでは、単一記事モードで記事を閲覧したとき、

function RefererCheck()

の中で、有効なリファラか判定するために、

if(!ereg("^https?://.{6,}",$HTTP_REFERER)) return;

となっている。 ’//’ のあとに、任意の6文字以上があれば有効と見做している。

しかし、「ドメイン名の文字数と使える文字の制限」に書いたように、 http://a.cn/ など、1文字ドメインからのアクセスを考えると、これではまずい。

その部分を、

if (!preg_match("/^https?:\/\/([[:alnum:]-&#;%\.\\\\]+\.|)[[:alnum:]-&#;%\\\\]+\.[[:alnum:]-&#;%\\\\]+([\/]?|\/[[:alnum:]-_&=%#!?;~:@\/\$\.\"\']+|\.|)$/", $HTTP_REFERER)) return;

と変更する。

これで、少なくとも第2レベルドメインまで存在し、

http://foo.jp
http://foo.jp.
http://foo.jp/
http://www.foo.jp/
http://www.foo.bar.jp/
http://foo.jp/bar
http://foo.jp/bar.php
http://foo.jp/bar.php?u=sample
http://foo.jp/bar.php?u=sample&date=2018-12

などの形式の場合に有効なリファラと判断するようになる。

数値参照でエンコードされてきた場合などを考えて、ラベルには「%&#;\」などを追加してあるが、必要ないかもしれない。

キーワード: rNote リファラ referer


JPNIC を見ると、ドメイン名とは、ウェブアドレスまたは電子メールアドレスの内、下の下線の部分で、ドット (.) で区切られた各部分を「ラベル」と呼び、右端のラベルから左に向けて、トップレベルドメイン、第2レベルドメイン、第3レベルドメイン、・・・と呼ばれるらしい。

・電子メールアドレスの場合:

email@bar.co.jp

・ウェブアドレスの場合:

www.foo.co.jp

また、文字列の長さについては、

  • ドメイン名全体では、253文字以下。
  • 1つのラベルは、63文字以下。
  • 日本語ドメインの場合は、ラベル1つは、15文字以下。

使える文字は、

ラベルには大文字、小文字の区別はない。

  • 英字(A-Z)。
  • 数字(0-9)。
  • ハイフン(-)。
  • 日本語ドメインの場合は、上に加えて全角ひらがな、カタカナ、漢字、全角記号。

だが、 JPNIC の説明には、ドメイン名全体およびラベル1つの最長の文字数については書かれていても、最短で何文字以上必要かが言及されていない。

.jp ドメイン名の登録管理は JPNIC がしているんじゃないのか、もっときちんとした説明はないの?と検索してみると、どうも2000年に JPNIC 総会で新会社設立が決議され同年設立された JPRS という企業に移管したようで、現在はそこが管理をしているようだ。

JPRS の「使用できる文字」によると、

  • 英数字 .jp ドメイン名の場合、3文字以上63文字以下
  • 日本語 .jp ドメイン名の場合、1文字以上15文字以下

と、しっかり明記されていた。つまり、 a.jp (半角のみ)はダメだが、あ.jp (全角の ‘あ’ 1文字)はオーケー、ということになる。( こちらによると .cn ドメインでは取得できるらしい。管理団体の考え方によってまちまち、ということか?)

ちなみに、同じページに、「全角ひらがな・カタカナ・漢字・半角英数字(A~Z、0~9)・半角のハイフン「-」上記以外に「・」「ヽ」「ヾ」「ゝ」「ゞ」「々」「ー」なども使用可能」とあるので、意外だが全角アルファベットは日本語ドメイン名としては使用できない。全角アルファベットは半角アルファベットと区別されない仕様のようだ。実際 chrome の URL 入力欄に全角アルファベットで英数字ドメイン名を入力してみると、英数字ドメイン名に置換され何もなかったかのようにページが開いた。

キーワード: ドメイン名 文字数


html_body.skin の中で、

<script src="lightbox2/js/lightbox.js"></script>

などと記述した場合、 HOME で記事一覧を表示中は問題ないが、サブカテゴリの記事を表示中には、ディレクトリ位置が変わるのでスクリプトを正しく読み込めないのが分かった。そこで、 rnote.php が存在する場所を / からの相対ディレクトリで返す、

<%=$site_dir%>

を追加した。これを使って、



<script src="<%=$site_dir%>lightbox2/js/lightbox.js"></script>

と記述することで、読み込まれたファイルのディレクトリが変わっても問題なくスクリプトを読み込める。

キーワード: rNote 置換命令 <%=site_dir%>


CGI 版 php での制限 2018-12-21 (金) 13:52:50+09:00

ソフトウェア

最近、いつまでたってもブログのカウンタが増えないなあと思っていたが、原因が分かった。

リファラが取得できなかった場合はページ内移動かどうかの判定が出来ないため、カウントアップをしないようにしていたのだが、なぜかその部分のコードを通っていたのでカウントアップされていなかった。

どうしてなのか調べてみると、「さくらサーバでのfilter_input(INPUT_SERVERの挙動が・・」のコメントによると、どうやら、 CGI 版の php では、

filter_input(INPUT_SERVER,'HTTP_REFERER')

などの INPUT_SERVER を引数に取るもの( $_SERVER の値)が全滅するらしい。

$_SERVER['HTTP_REFERER']

に戻したら、以前のようにカウントアップするようになった。

ちなみに、「PHP filter_input(INPUT_SERVER, 'REQUEST_METHOD') returns null?」によると、 CGI 版では filter_input() を用いた場合 INPUT_SERVER, INPUT_ENV の値は取得できなくて、INPUT_GET, INPUT_POST, INPUT_COOKIE の値は取得できるそうだ。

キーワード: php CGI filter_input INPUT_SERVER bug


記事の日時の表示を修正 2018-12-20 (木) 22:46:45+09:00

ソフトウェア

これまでは、 “YYYY-mm-dd (曜日) TT:MM:SS” の形式だったが、これだとどのタイムゾーンに属する場所での表示なのか、さっぱり分からない。「このブログを閲覧するのは日本国内からだけ」であれば、それでも問題ないのだが、海外からも閲覧されることを考えると、これではまずい。

ブログのホームのどこかか記事の日時表示の隣などに、「日本」と国名を表記するとか、いっそタイムゾーン文字列そのもの( ‘Asia/Tokyo’ )を表示するのもだめではないと思うが、それだと閲覧者は、自分の今いる場所での時刻と比べ、どれだけ差があるのか、やっぱり分からない。

そこで、のりさんの「朝顔日記」を参考に、記事の公開日時の表示形式を“YYYY-mm-dd (曜日) HH:MM:SS+HH:MM” のような形式に修正した。 “+HH:MM” の部分は、 UTC からの時差を表す。

この形式で時差を表示するために rnote.php 本体を改造する必要があると思っていたが、ソースを読むと、最初からこの形式での時差の表示機能が実装されていた。

rNote では、 html_item.skin ファイルに Date タグで日時を表示させる際の fmt オプションに “%z” を付けることで、この形式での時差が表示される。今回は "%Y-%m-%d (%a) %H:%M:%S%z" とした。

キーワード: rNote 日時 UTC 時差