ネットサーフィンしているとサイトによって拡張子があったりなかったりして不思議と思った方もいるのではないでしょうか?
実は拡張子が見えないサイトは意図してそれを隠していたりします。
今回は、.htaccessを使用して拡張子を省略した状態でサイトを表示する方法を見てみたいと思います。
拡張子を省略してサイトを表示したい
拡張子を省略するというのは、例えば、
「http://hogeFuga.com/index.html」というURLを入力してサイトにアクセスしていたのを
「http://hogeFuga.com/index」というように
「index.html」の拡張子を省略した形でサイトにアクセスできるようにすることをいいます。
記述例1:
1 | RewriteEngine On
|
2 | RewriteBase /
|
3 |
|
4 | RewriteCond %{REQUEST_FILENAME}\.php -f
|
5 | RewriteRule ^(.+)$ $1\.php
|
各行の説明
.htaccessの始めに記述します。
これを省略したり、「Off」と記述していると.htaccessが機能しません。
どのディレクトリから.htaccessの記述を適用するかパスを指定します。
「/」は、index.html などのブラウザにページ内容を表示するファイルが入っているディレクトリ(ルートディレクトリ)を表しています。
.htaccessが、ルートディレクトリにある場合、この「RewriteBase」の記述は省略してもOKです。
4 | RewriteCond %{REQUEST_FILENAME}\.php -f
|
URLに「.php」という拡張子のファイルがある場合という意味です。
「-f」が付いているので、リクエストされたURLに「.php」というファイルがあるならという意味です。
変数
「%{REQUEST_FILENAME}」は、入力されたURLに含まれるファイル名を格納しているものになります。
「RewriteCond」の「Cond」は「Condition」の略省です。書き換える条件を記述します。
5 | RewriteRule ^(.+)$ $1\.php
|
「http://hogeFuga.com/index」と入力されてたら、「http://hogeFuga.com/index.php」と入力されたものとしてサーバに認識させるという意味です。
これによって、ファイル拡張子を省略したURLを使えるようになります。
正規表現で、「^(.+)$」は任意(何でもいい)の文字列から始まる、1文字以上の文字列という意味です。
また、「$1」は、$1の前に書かれた「^(.+)$」に対応した文字列を適用するという意味です。
拡張子を省略するメリット
拡張子を省略すると以下のメリットが挙げられます。
- 「.php」や「.py」などの拡張子を隠蔽することで、悪意のあるユーザにバックエンドのシステムがどのようなもので構成されているかを悟られ難くできる
- URLにおいてユーザに整然とした印象を与えられる
特に、一つ目のメリットが重要です。
ページの処理に当たって、バックエンドで実行されているプログラムが「PHP」なのか「Python」なのか「CGI」なのか特定されにくくすることで、ハッキング・クラッキングに微力ながら対処することができます。
また、例えば、バックエンドのシステムをPHPからPythonに変更した場合、ブックマークしていたサイトにアクセスできないということを防ぐことができます。
拡張子が変更されることによって、自身のブログを気に入っていただいたリピータのユーザさんに不便な思いをさせてしまうことを回避できます。
そういった
ユーザアビリティの観点からもメリットがあるといえるのではないでしょうか。
拡張子を特定されないようにアクセスさせたい
これは、本来
「http://hogeFuga.com/index.html」というURLでしか表示されないページに対し、
「http://hogeFuga.com/index.php」や
「http://hogeFuga.com/index.py」でアクセスされた場合でも、
「http://hogeFuga.com/index.html」にアクセスしたものとして処理することをいいます。
また、
「http://hogeFuga.com/index.abc」や
「http://hogeFuga.com/index.wwww」など、そもそもウェブで使われている拡張子として相応しくない
デタラメな拡張子でアクセスがあった場合にも有効です。
すなわち、どんな拡張子でアクセスしようともページが正常に表示されるということです。
これによって、
ページを正常に表示できるときの拡張子が何なのか判らなくできます。
記述例2:
1 | RewriteEngine On
|
2 | RewriteBase /
|
3 |
|
4 | RewriteCond %{REQUEST_FILENAME} !\.(css|js|jpg|jpeg|gif|png|xml)$ [NC]
|
5 | RewriteRule ^(.+)\.(.+)$ $1\.php
|
各行の説明
4 | RewriteCond %{REQUEST_FILENAME} !\.(css|js|jpg|jpeg|gif|png|xml)$ [NC]
|
アクセスがあったURLのファイル名に、CSS、JS、画像ファイル、または、XMLファイルでないときという意味です。
5 | RewriteRule ^(.+)\.(.+)$ $1\.php
|
任意の「ファイル名.拡張子名」でアクセスがあった場合、「ファイル名.拡張子名.php」と入力されたものとしてサーバに認識させるという意味です。
拡張子を特定されないようにするメリット
拡張子を偽装するメリットは、拡張子を省略するメリットの延長になりますが、拡張子を省略しただけの場合、当てずっぽうで拡張子を附加してアクセスして正常に表示されたときに入力した拡張子であると、特定されてしまいます。
したがって、
様々な拡張子で正常にページが表示されるかを確かめる試みを成功させないというメリットがあります。
最後に
今回は、URLの拡張子に関することについて触れました。
「拡張子を省略」することと「拡張子を特定されないようにする」ことをセットで使ってみてください。
完全ではありませんが、セキュリティの向上に繋がるので、是非、活用してみてください。
それでは、続きはまた次回にご期待を!