Ads

基本

RewriteEngine on

して、変換する条件がある場合は RewriteCond を並べて、RewriteRule で実行する変換を書く。 RewriteCond や RewriteRule には沢山オプションがあり、それにより効果も色々変わるので慣れるまでは複雑怪奇。 でも分かってしまえばこれほど何でも出来る道具は無いってくらいいろんなことが rewrite だけで出来るようになる。

クッキーを見てリダイレクトさせる。

/auth-area/ 以下のアクセスで、login というクッキーが無い場合はログイン画面(/login.php)に飛ばすようにするには以下のように書けば良いと思う。

RewriteEngine on
RewriteBase /auth-area/
RewriteCond %{HTTP_COOKIE} !login=
RewriteRule ^.*$ /login.php [R]

/~user/ を suexec を利用可能にしたまま /user/ でアクセス出来るようにする。

  • 結論
    UserDir enabled
    UserDir public_html
    RewriteEngine on
    RewriteRule ^/([a-zA-Z0-9]+)/(.*) /~$1/$2 [PT]
    RewriteRule ^/([a-zA-Z0-9]+)$     /~$1/   [PT]
  • 後ろの[PT]とか何も無し*1だと suexec が効かない。
  • [R]*2 だと /~user/ にリダイレクトされてしまうので suexec は効くが URI を変えたいという点では本末転倒。
  • [P]*3 だと suexec は効くし、URI も /user/ のまま行けるが、REMOTE_HOST が全部 httpd が動いてるサーバの IP になってしまう。
  • [PT]*4 だと、suexec も効くし、URI も /user/ のまま行けるし、REMOTE_HOST もちゃんとアクセス元のままなのでマル。

user.example.com で example.com/~user/ にアクセスさせる。

RewriteCond や RewriteRule では %{変数名} という形で環境変数を扱うことも出来る。

あと覚えておくと便利なのは RewriteRule の正規表現で出来た文字グループは $1 とかで変換後の文字列に埋めこめられるが、 同じように RewriteCond の正規表現で出来たグループも %1 とかで参照できるのだ。

これらを使うと以下のようなことが出来る。

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.example\.com$
RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9_-]+)\.example\.com$
RewriteRule ^/(.*)$ /~%1/$1 [PT]

これは example.com/~user/ の代わりに user.example.com でアクセスさせる例です。

www.example.com は書き換え対象から外したければ否定を表す ! を付けた RewriteCond を付けてやるなど工夫出来る。

/pukiwiki/?mod_rewrite を /pukiwiki/mod_rewrite のようにアクセスさせる

要は PukiWiki のページを ? 無しでアクセスさせたかったわけだが。 pukiwiki/.htaccess を次のような内容で作成することで出来た。

RewriteEngine on
RewriteRule ^([^\?\./]+)$ ?$1
  • ? を省いてるのは rewrite した先でまた rewrite されるループを避けるため。
  • . と / を省いてるのはアイコン等の静的リソースは rewrite しないため。

あぁ…。 でも、pukiwiki のリンクを ? 無しにするのがしんどそうだ…。 20箇所くらい修正しなきゃならんぽ。 しかも、plugin にも修正箇所が及ぶので cvs up とかする度に保守しないといけなさそうだ。 諦めようかな(^^;

一応、pukiwiki ディレクトリで次のコマンド一発で変換できるかな?

find -type f -name \*.php -exec perl -i -pe 's/\$script\?([^=]*)$/\$script$1/g' {} \;

戻すのは面倒くさそうなので考えないことにする。

mod_rewriteでRBLを使ったアクセス制御を行う

RBLを使ったアクセス制限をしたかったんだが、apache標準ではそういうモジュールは存在せず、第3者による実装モジュールやパッチも存在するがapacheのバージョンにより使えるモジュールやパッチがまちまちなので、何とかバージョン共通でコピペで使える方法が無いか考とえたアイデアの一つがこの mod_rewrite を使ったやり方です。

その方法とは外部プログラムを使って RewriteMap を定義して、それに REMOTE_ADDR を渡してアクセス元が SPAM か HAM かチェックするというものです。

続きはこちら...

HTTP_X_FORWARDED_FOR を RewriteCond で使うには?

CGI 等では X_FORWARDED_FOR という環境変数で X-Forwarded-For ヘッダにアクセスできるので、そのノリで %{HTTP_X_FORWARDED_FOR} にマッチさせてやれば良いかと思ったがこれでは取れないようだ。他に %{ENV:HTTP_X_FORWARDED_FOR} でも駄目なようだ。

正解は以下のようにしてやればよいということが分ったのでメモ。

RewriteCond %{HTTP:X-Forwarded-For} !^192\.168\.

参考リンク


*1 URI とファイルのパスの対応を rewrite する。
*2 Location ヘッダを出力してブラウザにリダイレクトさせる。
*3 httpd がプロキシして取得した結果をクライアントに返す。
*4 httpd プロセス内部の REQUEST_URI とかの値を書き換えて次のハンドラに処理を継続させる(多分)。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-10-15 (月) 20:59:25 (3242d)