声のかけら。にDigest認証をかけてみたよ
bbs.fuktommy.comは 声のかけら。 で作られています。 今回解決しようとした問題は次の2つです。
- スパム投稿を制限したい。
- 検索エンジンが検索履歴を削除するのを制限したい。
どちらも完全に防ぐことは難しいですが、 ある程度防げればいいかなあ、という程度です。 必要な箇所だけにDigest認証をかけることにしました。
スパム投稿の制限は、POSTに限ってダイジェスト認証をかけるという作戦で、 これは検索すると定番の設定が出てきます。
<Location "/">
<Limit POST>
Require valid-user
</Limit>
</Location>
検索履歴を削除するのの制限というのはどういうことかというと、 hogeという単語で検索すると、それが履歴に残り、 ?mycmd=delsearch&myword=hoge にアクセスすると 履歴から消えるという仕組みになっています。 これってPOSTでやるべきじゃね、という説もありますが、 直すのめんどくさいので今回はGETのままでやりました。 投稿もPOSTだけに制限されてるのか謎。
RewriteEngine On
RewriteCond %{QUERY_STRING} mycmd=delsearch
RewriteCond %{LA-U:REMOTE_USER} ^$
RewriteRule ^$ /login/ [R]
<Location "/login/">
Require valid-user
</Location>
/login/ って何かというと、 docrootで ln -s . login として作ったシンボリックリンクです。 Apacheの設定だけでやろうとしたけど、うまく行かなかった。 んで、削除URLにアクセスしようとすると、 /login/ に飛ばされて、Digest認証を要求されるという仕組み。 %{LA-U:REMOTE_USER} のところは思ったように機能してないんだけど、 これを外すと /login/ に2回アクセスしてる。謎。
パスワードファイルはこんな感じにして作る。
% htdigest -c bbs.fuktommy.com bbs.fuktommy.com guest
全体をまとめた設定ファイルはこんな感じ。
<VirtualHost *>
ServerAdmin webmaster@fuktommy.com
DocumentRoot /srv/www/bbs.fuktommy.com
ServerName bbs.fuktommy.com
ErrorLog /var/log/httpd/bbs.fuktommy.com.error.log
CustomLog /var/log/httpd/bbs.fuktommy.com.access.log combined
<Directory "/srv/www/bbs.fuktommy.com">
Options +Indexes +ExecCGI
AllowOverride None
RewriteEngine On
RewriteCond %{QUERY_STRING} mycmd=delsearch
RewriteCond %{LA-U:REMOTE_USER} ^$
RewriteRule ^$ /login/ [R]
</Directory>
<Location "/">
AuthType Digest
AuthName "bbs.fuktommy.com"
AuthUserFile /srv/passwd/bbs.fuktommy.com
<Limit POST>
Require valid-user
</Limit>
</Location>
<Location "/login/">
Require valid-user
</Location>
</VirtualHost>