2010年3月13日

[Apache-Users 7649] Re:.htaccess のrewriteルール

** Apache ユーザーズメーリングリスト **
** 注意:このメールへの返信は Apache-Users へ行きます **

こんにちは。笹尾です。

ちょっと気になったので確認してみました。

http://localhost/Anemone%20debilis.html


http://localhost/htmpage2.php?yspec=Anemone_debilis
の結果と同じにしたい、ということですよね。

ブラウザのLocation barに打ち込んだ時の挙動はいろいろありそうですが、
*URLとして* %20を含むアドレスをリクエストした時、.htaccessでは、
少なくとも%20はデコードされて半角スペースに戻っているようです。

ということで
http://localhost/Anemone%20debilis.html

RewriteRule "^([A-Za-z ]+)\.html$" ...
にマッチしますし、
RewriteRule ^([A-Za-z0-9%]+)\.html$ ...
にはマッチしません。(Apache/2.2.3, Linuxにて確認)
スペースを含むルールの場合、"..."で囲む必要があります。

/については、特に問題ないと思いますが、
http://localhost/Rosa_/'Matilda/'.html
は、
RewriteRule ^([A-Za-z_/']+)\.html$ ...
にマッチします。

ところで、
RewriteRule ^([0-9A-Za-z_.'=-%]+)\.html$ htmpage2.php?yspec=$1 [L]
は、.が任意の1文字にマッチするので、
RewriteRule ^(.+)\.html$ htmpage2.php?yspec=$1 [L]
と書いても同じです。さらに言えば、
=-%という書き方はa-zと同じようなルールで解釈されるのかどうか、
(普通の人には)わかりません。-を指定したければ、最後に書くと良いです。

ここから気になった本題です。

%20を含むURLをrewriteしてquery stringにそのまま渡すと、
%20はデコードされたまま(半角スペースとして)で渡されてしまいます。
(mod_rewrite等を使わない場合には、あり得ないことです。)

この動作を抑制するための簡単な方法が無く、
セキュリティ対策の都合でエンコードされてないパラメータを受け入れない
プログラムに渡したい場合、
http://wiki.bit-hive.com/tomizoo/pg/mod_rewrite%20-%20RewriteMap
にあるような方法が使われています。

mapを使わずに、query stringに不正文字を含めずに対応するのに、
環境変数にセットする方法があると思いますが、使えない場合もあります。
他に方法ご存じの方いらっしゃいませんか?


On Sat, 13 Mar 2010 12:41:17 +0900
"fujioka" <qhtsige@xxxxx> wrote:

> ** Apache ユーザーズメーリングリスト **
> ** 注意:このメールへの返信は Apache-Users へ行きます **
>
> 藤岡です。 .htaccess のrewrite ルールについて教えてください。
>
> 次のurl1,url2の場合、Internal server errorとなり、所望の変換ができません。
> error.logを見ると、どうも%や/文字が入る正規表現を変換することができないように見えます。
> どんな対策が良いでしょうか。
>
> 要求されたURL1 http://localhost/Rosa_/'Matilda/'.html
> 変換したいURL1 http://localhost/Rosa_'Matilda'.html /記号を削除。
>
> 要求されたURL2 http://localhost/Anemone%20debilis.html
> 変換したいURL2 http://localhost/Anemone_debilis.html   %20を_記号に置き換える。
>
>
> .htaccess
> RewriteEngine on
> RewriteBase /
>
> RewriteCond %{REQUEST_FILENAME} !-f
> RewriteCond %{REQUEST_FILENAME} !-d
> RewriteRule ^([0-9A-Za-z_.'=-%]+)\.html$ htmpage2.php?yspec=$1 [L]
>
>
> error.log
>
> ^([0-9A-Za-z_.'=-%]+)\.html$ の場合--> '^([0-9A-Za-z_.'=-%]+)\\.html$'
> ^([0-9A-Za-z_.'=-\%]+)\.html$ の場合--> '^([0-9A-Za-z_.'=-\\%]+)\\.html$'
> ^([0-9A-Za-z_.'=-/]+)\.html$ の場合--> '^([0-9A-Za-z_.'=-/]+)\\.html$'
> ^([0-9A-Za-z_.'=-\/]+)\.html$ の場合--> '^([0-9A-Za-z_.'=-\\/]+)\\.html$'
>
> 上記では、すべて全文では次のようになるが、略して書いた。
> [Sat Mar 13 12:12:52 2010] [alert] [client 127.0.0.1] D:/upload/.htaccess:
> RewriteRule: cannot compile regular expression
> '^([0-9A-Za-z_.'=-%]+)\\.html$'
> --
> 入退会・変更・配送一時停止は以下へ
> http://www.apache.jp/mailman/listinfo/apache-users

--
笹尾 卓宏 @ P-strain <sasao@xxxxx>

--
入退会・変更・配送一時停止は以下へ
http://www.apache.jp/mailman/listinfo/apache-users


投稿者 xml-rpc : 2010年3月13日 14:44
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/94104
トラックバック
コメント
コメントする




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