ISAPI_Rewrite

| | コメント(10) | トラックバック(2)

正規表現の使える強力なURL manipulation engineです。
C/C++で書かれたISAPIフィルターで、IISで動きます。
Apacheのmod_rewriteのような動作をします。

・ISAPI_Rewrite - URL Rewrite engine for IIS, ISAPI Filter for URL Rewriting, mod_rewrite for IIS
http://www.isapirewrite.com/

「ISAPI_Rewrite Full」と「ISAPI_Rewrite Lite」があります。
「Full」は30日間はトライアルで無料です。
「Lite」は「Full」に機能制限がかかりますが、完全に無料です。
制限される機能は、

  • per-virtual-site configurations
  • proxiing
  • metabase monitoring
  • automatic cache cleanup

です。

2003/10/13現在、最新のバージョンは、「ISAPI_Rewrite version 2.2 build 34」です。

インストール
インストールは、インストーラーを実行するだけ。
デフォルトのインストール先は、「C:\Program Files\Helicon\ISAPI_Rewrite\」です。

インストールが完了すると、「インターネットインフォメーションサービス」の「Webサイトのプロパティ」の「ISAPIフィルタ」タブに「ISAPI_Rewrite」が登録されています。

設定
サーバーレベル(global)とサイトレベル(individual)で設定が出来ますが、Lite版はサーバーレベルでしか設定が出来ません。

サーバレベルの設定ファイルはISAPI_Rewriteインストールフォルダのhttpd.iniです。
(サイトレベルの設定ファイルは各バーチャルサイトのルートディレクトリになります。)

ISAPI_Rewriteインストールフォルダにデフォルトの設定ファイル「httpd.ini」がありました。

● サンプル (httpd.ini)

[ISAPI_Rewrite]
 
# This is a comment
 
# 300 = 5 minutes
CacheClockRate 300
RepeatLimit 20
 
# Block external access to the httpd.ini and httpd.parse.errors files
RewriteRule /httpd(?:\.ini|\.parse\.errors) . [F,I,O]
 
# Defend your computer from some worm attacks
RewriteRule .*(?:global.asa|default\.ida|root\.exe|\.\.).* . [F,I,O]
 
# Block external access to the Helper ISAPI Extension
RewriteRule .*\.isrwhlp . [F,I,O]
 
RewriteRule .*(?:dontlook\.html) /error.html
 
RewriteRule .*(?:dontlook2\.html) /error.html [U]
 
# Some custom rules
RewriteCond Host: (.+)
RewriteRule (.*) /$1$2 [I]
 
RewriteHeader User-Agent: .* $0
 
RewriteCond URL (.*)
RewriteHeader Old-URL: ^$ $1
 
RewriteCond METHOD OPTIONS
RewriteRule (.*) /webdav.asp?$1
RewriteHeader METHOD OPTIONS GET

● 各行を説明

[ISAPI_Rewrite]

現在のバージョンでは、すべてISAPI_Rewriteセクションの中にあります。

# 300 = 5 minutes
CacheClockRate 300
RepeatLimit 20

CacheClockRateはよくわかりません・・・。
RepeatLimitはRewriteRuleとRewriteHeaderディレクティブでルールがループできる回数を指定します。
ここでは、20回までに設定。
デフォルト値は32です。
0か1をセットすると、ループしません。

# Block external access to the httpd.ini and httpd.parse.errors files
RewriteRule /httpd(?:\.ini|\.parse\.errors) . [F,I,O]

書き換えを行うルールを設定します。
上のルールから処理されていくので、RewriteRuleディレクティブが出てくる順番は重要です。

Request-URIが、
大文字小文字を区別せずに[I]、
「/httpd.ini」か「/httpd.parse.errors」の時、
403 Forbidden レスポンスを返す[F]。
また、実行前に文字をURLエンコーディングや不正文字の削除などの処理を行う[O]。
「?:」は、マッチした文字列を$1[$2,..,$N]で取得できないようにします(多分)。
(SEE: Non-Marking Parenthesisの項目)

[F]を指定した場合、パターンにマッチすると、UAに「The requested resource could not be found.」を表示します。
また、この時IISのログファイルには記録されません。

ちなみに、マニュアルの例では

# Block external access to the httpd.ini and httpd.parse.errors files
RewriteRule /httpd(?:.ini|\.parse\.errors) [F,I,O]

となっていました。
1. 「.ini」の前に「\」がない。
2. 「RewriteRule」の第2引数(っていうのかな?)の「FormatString」がない。
で、だめだめだと思うんですが、、、。
「[F,I,O]」が「FormatString」として扱われてリダイレクトされてしまいました(2.の理由により)。

# Defend your computer from some worm attacks
RewriteRule .*(?:global.asa|default\.ida|root\.exe|\.\.).* . [F,I,O]

上と同じ条件で、「global.asa」か「default.ida」か「root.exe」か「..」が含まれる時。

# Block external access to the Helper ISAPI Extension
RewriteRule .*\.isrwhlp . [F,I,O]

上と同じ条件で、「.isrwhlp」で終わる時。

RewriteRule .*(?:dontlook\.html) /error.html

Request-URIが、
「dontlook.html」で終わる時、
「/error.html」を表示します。
IISのログには、/error.htmlが記録されます。

RewriteRule .*(?:dontlook2\.html) /error.html [U]

Request-URIが、
「dontlook2.html」で終わる時、
「/error.html」を表示します。
IISのログには、「dontlook2.html」で終わる書き換える前のRequest-URIが記録されます。

# Some custom rules
RewriteCond Host: (.+)
RewriteRule (.*) /$1$2 [I]

Hostヘッダーがあった場合、
大文字小文字を区別せずに[I]、
「Request-URI」を「/[Hostヘッダー値][Request-URI]」に書き換えます(かな?)。

RewriteHeader User-Agent: .* $0

User-Agentヘッダーを、削除します。

RewriteCond URL (.*)
RewriteHeader Old-URL: ^$ $1

Request-URIがあった場合、
Old-URLを空文字(はじめはこのヘッダーがなかった)から[Request-URI]に置き換えます。

RewriteCond METHOD OPTIONS
RewriteRule (.*) /webdav.asp?$1
RewriteHeader METHOD OPTIONS GET

OPTIONSメソッドの場合、
Request-URIを「/webdav.asp?[Request-URI]」に置き換え、
OPTIONSメソッドを、GETメソッドに置き換えます。

多分、こんな感じ、、、自信ないけど。。。
他にも、色々あるので、マニュアル見てね(ひどい?)

Regular Expression Test Utility
正規表現や、Format stringをチェックするためのツールが用意されています。
スタートメニューから起動できるので、色々触ってみるといいでしょう。

お願い
間違ってるくさいなぁ。。。
自信ないなぁ。。。
間違いがあったら、指摘してください。。

動的なURLを静的なURLに見せる (2006/06/15 追記)

コメントでそんな感じの話しが出てるので、確認してみました。
コメントも参照。

http://www.example.jp/image_files/画像ファイル名
(ここで、「画像ファイル名」は、ファイル名は英数字のみ、拡張子はpng,jpg,gifのいずれか)

にアクセスすると、

http://www.example.jp/cgi/print_filename.pl?file=画像ファイル名

を表示するけど、ブラウザに表示されるURLは最初のままにしたいとします。

「httpd.ini」に以下を追加して、IISを再起動します。

RewriteRule ^/image_files/([a-zA-Z0-9]+)\.(png|jpg|gif)$ /cgi/print_filename.pl?file=$1.$2

ちなみに、QueryString「file」の値を表示するだけの「print_filename.pl」を作成して確認しました。

#!perl
use CGI; 
$query = new CGI;
$filename = $query->param('file');
print "Content-type: text/plain\n\n";
print "filename=$filename";

他のURL 書き換え用の ISAPI フィルタ (2006/06/17 追記)

こういうのも↓のもあるらしいけど、未使用。

・Qwerksoft - IIS Rewrite Engine, ISAPI Filter for URL Rewriting, mod_rewrite for IIS
http://www.qwerksoft.com/products/iisrewrite/
IIS Rewrite

・PageXchanger for Clean, Persistent URLs :: Port80 Software
http://port80software.com/products/pagexchanger/
PageXChanger

トラックバック(2)

このブログ記事を参照しているブログ一覧: ISAPI_Rewrite

このブログ記事に対するトラックバックURL: http://kinshachi.ddo.jp/mt/mt-tb.cgi/21

» [Web][覚書]IISで”.htaccess”の基本認証を使う(masahirorの気まま記録簿)~のトラックバック

Microsoft IISで、Apacheの「.htaccess」によるパスワード認証を行いたい場合、「IISPassword」を導入する事で実現できる。 IIS Password Protection Software by Troxo - IISPassword http://www.troxo.com/products/iispassword/ IISにも基本認証機能はあるが、わざわざWi 続きを読む

» 動的ページ(CGI、PHP、ASP)の拡張子・パラーメタを静的ページに偽装する(正攻法でがんばるアフィリエイト入門サイト 管理人ブログ)~のトラックバック

前回のエントリ SEOの観点からCGI、PHP等の動的ページは不利か からの続きです。 前回の結論としては、動的ページより静的ページの方がインデックス化されやすいという話に、そこそこの理由はありそうといった感じでし 続きを読む

コメント(10)

みつ :

現在、コンピュータ系blogのISAPI_Rewriteを
参考に URLの書き換えを行なっている
のですが、うまくいきません。

http://mt-sv/DEV /
est.asp?Req_File=text_Succ.png
⇒http://mt-sv/DEV/text_Succ.png.test

のような書き換え(簡略化)を行ないたいのですが・・・。

ご教授宜しくお願いします。

さら :

現在、コンピュータ系blogのISAPI_Rewriteを
参考に URLの書き換えを行なっている
のですが、うまくいきません。

"http://mt-sv/DEV /test.asp?Req_File=text_Succ.png"
⇒"http://mt-sv/DEV/text_Succ.png.test"

のような書き換え(簡略化)を行ないたいのですが・・・。

ご教授宜しくお願いします。

ike :

(さら|みつ)さん。
ISAPI_Rewriteはずーーっと使ってなくて、すっっっかり忘れちゃいました。。
手元のマシンに入ってないんで試せないんですよ。
設定方法が昔と変わってるかもしれないし・・。
多分、動的URLを静的URLに見せたいんですよね?

・ISAPI_Rewrite|ASP.NETでブログを作る
http://ameblo.jp/mo09/entry-10002358302.html
を参考にさせて頂くと、
http://aaa.com/blog_id/
にアクセスした時、
http://aaa.com/blog.asp?blog_id=blog_id
を表示するには
RewriteRule /([0-9a-zA-Z]*) /test1.asp\?a=$1
という例があるので、
RewriteRule /DEV/([0-9a-zA-Z_\.]+).([0-9a-zA-Z]+) /DEV/$2.asp\?Req_File=$1
とかかなぁ、、、?
ちょっと試行錯誤しないと分からなさそうですね。

ちなみに、どういう設定を試して、どうなりましたか?

さら :

返信有難うございます!

説明不足で申し訳御座いません。

?http://localhost/dev/send.asp
 でコンボボックス選択にて
 /DEV/dataの中のファイルを選択します。

 (test.aspには選択された際の表示処理
  などが記述されています)

?選択後は下記のURLとなり
  "text_Succ.png"の内容(画像)が表示
  されます。
  http://3c-del01/dev/test.asp?
 Req_File=text_Succ.png

ISAPI_Rewriteが機能しているのか
httpd.iniを編集して確認したところ、
機能していました。

RewriteRule .*(?:text_Succ\.png) /error.html
を追加して確認してみると
error.htmlは存在しないのでエラーとなった

RewriteRule /DEV/([0-9a-zA-Z_\.]+).([0-9a-zA-Z]+) /DEV/$2.asp\?Req_File=$1
を追加しましたが
URLは
http://3c-del01/dev/test.asp?Req_File=text_Succ.png
のままでした。

ISAPI_Rewriteの理解もまだ乏しいまま
行っていますので説明も不足しているかと
思われますが
何かご教授願います。

ike :

申し訳ありませんが、当時触って以来触っていないので、すっかり忘れてしまっています。
これ以上は分かりかねます。

まず、近い処理を行ってるようなので、コメントに書いた「ISAPI_Rewrite|ASP.NETでブログを作る」の例が実際に手元の環境で動く事を確認してみるのが良いと思います。
その後、少しずつ変更して、試行錯誤して自分のやりたい事に近づけていくのが良いと思います。

・念のため、適当なerror.htmlを作成し、(エラーになる事を確認するのではなく)ちゃんとerror.htmlが表示されるかを確認する
・「Regular Expression Test Utility」を使って正規表現を確認してみる
・「text_Succ.png.test」の「test」は、「test.asp」の「test」に対応してると思っていますが、この「test」をルールに決め打ちして動かしてみる($2部分)
・RewriteRule 行の最後に [U] を付けて、IISのアクセスログを確認する(変更前のURLのログが表示される?)。また、[U]をつけない場合も確認。
などの試行錯誤をすると良いかもしれません。

みつ :

返信遅れまして申し訳御座いません。
回答ありがとう御座います。

試行錯誤しながら試していますので
また不明点などはご教授願えればと
思っております。

ike :

みつさん。
力不足でもうしわけないです。
がんばってください。

みつ :

その他の掲示板でも質問させて頂いてますが、何か少しでも分かれば教えて下さい。

最終的には
"http://**/DEV/abc.asp?Req_File=xx.xx"
のURLで入力された場合、
URLの表示上は
"http://**/DEV/abc/xx.xx"
のような状態で
表示内容は
"http://**/DEV/abc.asp?Req_File=xx.xx"
の内容を表示させたいのです。

httpd.iniの編集内容は
RewriteRule
/DEV/sub.asp\?Req_File=(.*)\.(.*)
 /DEV/sub/$1.$2 [RP]
RewriteRule
/DEV/sub/(.*)\.(.*)
  /DEV/sub.asp\?Req_File=$1.$2
と2行追加したのですが、
永久に読込みされてしまいます。
また、ループを制限する行も追加したのですが画面には何も表示されない状態です。

申し訳ないのですが、
お願いします。

ike :

みつさん
「sub.asp」は「abc.asp」ですかね?
すっかり忘れてるのでトンチンカンな事を言ってるかもしれませんが、思った事だけ書いておきます。

きっと、ブラウザに表示されるURLをそのまま(/DEV/abc/xx.xx形式)にしたいので、2つ目のRewriteRuleを書いてるんですよね?
RewriteRuleで[R]や[RP]を指定するとリダイレクト(URLが変わる)しちゃいません?
1つ目のRewriteRuleだけにして以下の事を試すとどうなります?
・[R]や[RP]をつけない
・[R]や[RP]をつず、[U]をつける (IISログにどう記録されるかだけの違い?)
・[R]や[RP]をつず、[L]をつける (URLは書き換わって次のRewriteRuleを処理しないだけ?)

質問してる「その他の掲示板」でどういう話になってるか分からないので、後退する返事(既にやった)かもしれませんね。。

みつ :

ike様 返信ありがとうございます。

私がトンチンカンな事を言っておりました。
すみません。

やりたい事は、
(〜/DEV/abc.asp?Req_File=xx.xx) のURLが入力された際、
ブラウザに表示されるURLのみ (〜/DEV/abc/xx.xx)の形式にして
表示させ、内容は (〜/DEV/abc.asp?Req_File=xx.xx) のものを表示させます。

なので、RewriteRule/DEV/sub.asp\Req_File=(.*)\.(.*) /DEV/sub/$1.$2 [RP]
でURLを (〜/DEV/abc/xx.xx)形式にし、
RewriteRule/DEV/sub/(.*)\.(.*) /DEV/sub.asp\?Req_File=$1.$2
で (〜/DEV/abc/xx.xx) のURLの時
(〜/DEV/abc.asp?Req_File=xx.xx) の内容を表示させようとしたのですが・・・。

試行錯誤しながらやっておりますが
何かご存知でしたらご教授願います。

その他の掲示板にも質問しておりますが
IIS_Rewriteを知っている方がほとんどいなくて・・・。

コメントする


画像の中に見える文字を入力してください。

このブログ記事について

このページは、ikeが2003年10月13日 17:17に書いたブログ記事です。

ひとつ前のブログ記事は「ia_archiver (robot)」です。

次のブログ記事は「dloader(NaverRobot)/1.5 (robot)」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

最近のコメント

On ISAPI_Rewrite
  • みつ: ike様 返信ありがとうございます。
  • ike: みつさん 「sub.asp」は「abc.
  • みつ: その他の掲示板でも質問させて頂いてますが
  • ike: みつさん。 力不足でもうしわけないです。
  • みつ: 返信遅れまして申し訳御座いません。 回答
  • ike: 申し訳ありませんが、当時触って以来触って
  • さら: 返信有難うございます! 説明不足で申し
  • ike: (さら|みつ)さん。 ISAPI_Rew
  • さら: 現在、コンピュータ系blogのISAPI
  • みつ: 現在、コンピュータ系blogのISAPI
Powered by Movable Type 4.261