▼ [Apache] mod_rewrite の小技
ループ処理
mod_rewrite でループ処理を行うには、[N] (next) フラグを利用する。たとえば、/hoge/1/bar/2/baz/3/ を /hoge/index.cgi?foo=1&bar=2&baz=3 としたい (その際、パラメータの個数が不定) 場合、下記の通り記述する。"QSA" (query string append) フラグは、書き換え後の QUERY_STRING 部分のみ "追加" の扱いとする。
RewriteEngine on RewriteLog /var/log/httpd/rewrite.log RewriteLogLevel 9 # Rule 1: RewriteRule ^(/hoge/.*/)([^/]+)/([^/]+)/$ $1?$2=$3&path=$1 [QSA,N] # Rule 2: RewriteRule ^/hoge/([^/]+)/$ /hoge/index.cgi?foo=$1 [QSA]
処理の流れは以下の通り。
- path = "/hoge/1/bar/2/baz/3/", QUERY_STRING="" → Rule 1
- path = "/hoge/1/bar/2/", QUERY_STRING="baz=3" → Rule 1
- path = "/hoge/1/", QUERY_STRING="bar=2&baz=3" → Rule 2
- path = "/hoge/index.cgi", QUERY_STRING="foo=1&bar=2&baz=3"
日本語のファイル名に見せかけてSEO
ファイル名はSEOを考慮すると日本語 (UTF-8) で付けた方が良いが、日本語のファイル名はUnix上で扱いづらいという欠点がある。mod_rewrite を利用することで URL path中の日本語文字列を任意のファイル名 (英数字) にマッピングすることができる。
- httpd.conf に以下の行を追加
RewriteEngine on RewriteLog /var/log/httpd/rewrite.log RewriteLogLevel 9 RewriteMap foo_kanji_ascii txt:/www/etc/map/naiyo_kanji_ascii.txt RewriteRule ^/(.*[^!-~]+.*) /www/htdocs/${naiyo_kanji_ascii:$1}.html - /www/etc/map/naiyo_kanji_ascii.txt に UTF-8 で以下の内容を記載。
萌え moe
- httpd の再起動。
- http://www.example.com/%E8%90%8C%E3%81%88 へアクセスすると /www/htdocs/moe.html の内容が表示される。
大規模に書き換えを行う場合には、性能上の観点からテキストファイルではなくDBMファイルで用意することが望ましい。
▼ [spam] 国別DNSBL with rbldnsd
以前、特定の国からのメールをすべて拒否で、Postfix のみに利用できる方法を解説したが、他のソフト (Apache + mod_access_rbl や CGIプログラムなど) から利用可能にするには、DNSBLとして利用できる形態が望ましい。(DNSBLについては、Apache 1.3 + mod_access_rbl を参照。)
DNSBLの運用にBINDを利用することも可能ではあるが、ある程度規模があるDNSBLを運用する場合には設定ファイルの再読み込みに時間がかかるなどの問題があるため、ここでは rbldnsd を利用する方法を解説する。
導入するべきソフト
- dns/rbldnsd
方針
rbldnsdは 127.0.0.1:10053 で待ち受けする。BINDは特定のゾーン (rbldnsd.local) のクエリのみ rbldnsd を参照する。
+------+ +---------+
query -->| *.53 | --> | L:10053 |
| BIND | | rbldnsd |
+------+ +---------+
設定方法
- 設定ファイルの作成・修正
# mkdir /usr/local/etc/rbldnsd # cd /usr/local/etc/rbldnsd # vi rbldnsd.rbl # vi /etc/namedb/named.conf # vi /etc/rc.conf # /usr/local/etc/rc.d/rbldnsd.sh start
rbldnsd.rbl の記載内容は以下の通り (実際のデータの一部):$DATASET ip4set:ad ad :127.0.0.1:Andorra 194.158.64.0-194.158.95.255 85.94.160.0-85.94.191.255 91.187.64.0-91.187.95.255 $DATASET ip4set:ae ae :127.0.0.1:United Arab Emirates 194.170.0.0-194.170.255.255 195.229.0.0-195.229.255.255 213.132.32.0-213.132.63.255
named.confの追加内容は以下の通り:zone "rbldnsd.local" { type forward; forward first; forwarders { 127.0.0.1 port 10053; }; };rc.confの追加内容は以下の通り:rbldnsd_enable="YES" rbldnsd_flags="-u bind:bind -r /usr/local/etc/rbldnsd -b 127.0.0.1/10053 -c 0 rbldnsd.net:combined:rbldnsd.rbl"
- 194.158.64.0 は Andorra に割り当てられたアドレスなので、"ad.rbldnsd.local" にはレコードが存在し、"jp.rbldnsd.local" には存在しないことを確認する。
% host 0.64.158.194.ad.rbldnsd.local 0.64.158.194.ad.rbldnsd.local has address 127.0.0.1 % host -t txt 0.64.158.194.ad.rbldnsd.local 0.64.158.194.ad.rbldnsd.local descriptive text "Andorra" % host 0.64.158.194.jp.rbldnsd.local Host 0.64.158.194.jp.rbldnsd.local not found: 3(NXDOMAIN)
- 外部からの利用を許したくない場合、ゾーン設定に
allow-queryを追加すればよい。(以下の例は127.0.0.1, 192.168.1.0/24 のみを許可する場合。)allow-query { 127.0.0.1; 192.168.1.0/24; }; - 必要に応じて Apache や Postfix などの設定を行う。
とりあえず、試験的に countrycode.dnsacl.net を立ち上げてみた。たとえば、kr.dnsacl.net は韓国のアドレスをブロックするDNSBLになっている。("acl" は access control list; ホワイトリストにも利用できるため。)
▼ [Apache] 画像への直接リンクを防ぐ (補足)
画像への直接リンクを防ぐ (2007/07/23) の補足。
RFC 2616 で Referer: は以下の通り定義されており、絶対URIの他、相対URIを含めることも許されている。
Referer = "Referer" ":" ( absoluteURI | relativeURI )RFC 2616: Hypertext Transfer Protocol (HTTP/1.1), 14.36 Referer
したがって、
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://www\.example\.jp/ [NC]
RewriteCond %{REQUEST_URI} !^/tmp/eroero\.gif$
RewriteRule \.(jpg|png|gif)$ http://www.example.jp/tmp/eroero.gif [R,NC]
は、下記の通りとするべきである。
RewriteCond %{HTTP_REFERER} ^http://
RewriteCond %{HTTP_REFERER} !^http://www\.example\.jp/ [NC]
RewriteCond %{REQUEST_URI} !^/tmp/eroero\.gif$
RewriteRule \.(jpg|png|gif)$ http://www.example.jp/tmp/eroero.gif [R,NC]
なお、(アンチウイルスソフトによっては) Referer: に blocked by XXXX とかいう訳のわからん文字列を突っ込んできます
との指摘があったが、今回の修正で救われる。とはいえ、これはRFCに違反するそのベンダと利用者の責任であるため、積極的に救う必要は無いだろう。
▼ [未分類] 外国人参政権
でも、在日3世の僕には選挙権が無い。両親も自分も名古屋育ち。日常生活は日本語。日本人とほとんど同じ生活をしている。在日は今では4世までいて、ずっと日本人と一緒に暮らしてきた。戦後の日本復旧を一緒に支えてきたという面もあると思うし、そろそろ信頼して参政権を与えて欲しい。 "今でも遠い参政権", 金原 大志, 2007/07/27 朝日新聞朝刊 "私もひとこと 07参院選"
そもそも参政権というものは、国民のみが持つ重要な権利である。参政権を望むのであれば、帰化して日本国籍を取得すれば良いのだ。韓国人として "日本" という運命共同体の外から国政へ関わりたいというのは、我侭でしかない。自国民と外国人は対等ではないのは当然のことで、これは "差別" ではなく "区別" である。
なお、帰化申請全体の数%程度は不許可となるが、帰化の判断は各国がそれぞれ自由に決定するものなのでこれは諦めてもらうしかないだろう。もっとも、今回のようなケースで不許可になることはまず無いと思うが。
