Your browser (Internet Explorer 6) is out of date. It has known security flaws and may not display all features of this and other websites. Learn how to update your browser.
X
Post

.htaccessでRewriteする時、正規表現の対象外となる文字

phpネタです。



.htaccessのRewriteを利用する事で、
URLの書き換えが実行できます。

Options FollowSymLinks Includes
RewriteEngine on
RewriteBase /
RewriteRule !\.*$ test.php

例えばこのように記述する事で、
このディレクトリ下へのアクセスは全てtest.phpへと書き換えられます。

で、ここで例外となる文字、
つまり正しく処理されない文字があるか気になったので調べてみました。


書き換え先のtest.phpには
phpinfo()を記述し、そこでリクエスト情報を参照します。


まずは全角文字を打ってみますが、
それらは問題ありませんでした。

続いて記号。
大体は大丈夫ですが、正しく認識されない記号が2つありました。

一つは#で、シャープがあるとそれ以降はアンカータグと認識されるようです。
例えばhttp://localhost/url_str#ingならばリクエストはurl_strとなるなど。

もう一つは?で、それより先はGETのクエリストリングと解釈されました。


後は……/(スラッシュ)も認識したし、
自分が調べた限り他の記号も大丈夫でした。
正規表現で正しく認識できない記号はこの2つのようです。


で、この後、もう一つ気になった事が出てきました。
urlencodeしたらいいのではないか?
という事で、#をurlエンコードしてアクセスしてみる。
すると画面には次のメッセージが。


Access forbidden!
要求されたオブジェクトへのアクセス権がありません。 読み込みが許可されていないか、 サーバが読み込みに失敗したかでしょう。
サーバーの障害と思われる場合は、ウェブ管理者までご連絡ください。


ど、どういう事だ……?
今回は自分のxampp環境で試したのですが、
このメッセージは初めて見ました。


.htaccessのrewriteを使わずに、
URL中にURLエンコードした#を含めた場合にはこのメッセージは表示されませんでした。

という事は……
.htaccess中でrewriteする際に何かモジュールを使って
URLデコードしており、そこのモジュールに問題がある、というあたり?


んー、何か凄く気になるところですが、
これ以上は深入りする事になりそうだし疲れたのでここで一旦区切る事にしました。


今日の結論としては、rewriteする時は#と?は取り扱い注意という事で。

TrackBack URL :

Leave a comment  

name

email

website

Submit comment