• icon-clock
  • icon-undo

.htaccess を使って拡張子を省略してアクセス

.htaccess を使って拡張子を省略してアクセス

ネットサーフィンしているとサイトによって拡張子があったりなかったりして不思議に思ったことはありませんか?

実は、サイトによっては意図して拡張子を隠していたりします。

今回は、.htaccessを使った拡張子を省略してサイトを表示する方法を共有したいと思います。




拡張子を省略してサイトを表示する

URLに記述されているファイルの拡張子をブラウザに表示しないようにする方法です。

例えば、「http://hoge.com/index.html」というURLを入力してサイトにアクセスしていたのを「http://hoge.com/index」というように「index.html」の拡張子を省略した形でサイトにアクセスできるようにします。

記述例1
1RewriteEngine On
2RewriteBase /
3
4RewriteCond %{REQUEST_FILENAME}\.php -f
5RewriteRule ^(.+)$ $1\.html

以上がその記述例です。このままでは各記述の意味が分かりにくいので以下に解説していきます。


各行の説明

まず1行目から見てみたいと思います。

1RewriteEngine On

.htaccessの始めに記述します。これを省略したり「Off」と記述していると.htaccessが機能しません。


2RewriteBase /

どのディレクトリから.htaccessの記述を適用するのか、パスを指定します。

「/」は、index.html などのブラウザにページ内容を表示するファイルが入っているディレクトリ(ルートディレクトリ)を表しています。

もし.htaccessがルートディレクトリにある場合「RewriteBase」の記述は省略してもOKです。


4RewriteCond %{REQUEST_FILENAME}\.html -f

「RewriteCond %{REQUEST_FILENAME}\.html -f」は、「もしURLに「.html」という拡張子のファイルがあるなら」という意味です。

換言すると、「-f」がついているので、リクエストされたURLに「.html」という記述があった場合に適用されます。

変数「%{REQUEST_FILENAME}」は、入力されたURLに含まれるファイル名を表しています。

「RewriteCond」の「Cond」は「Condition」の略省です。つまり、書き換える条件を記述します。


5RewriteRule ^(.+)$ $1\.html

「http://hoge.com/index」と入力されてたら、「http://hoge.com/index.html」と入力されたものとしてサーバに認識させるという意味です。

これによって、ファイル拡張子を省略したURLを使えるようになります。

正規表現で、「^(.+)$」は任意(何でもいい)の文字列から始まる、1文字以上の文字列という意味です。

また、「$1」は$1の前に書かれた「^(.+)$」に対応した文字列を適用するという意味です。


拡張子を省略するメリット

拡張子を省略すると以下のメリットが挙げられます。

  1. 「.html」や「.py」などの拡張子を隠すことで、悪意のあるユーザにバックエンドのシステムがどうなっているかを悟られにくくできる
  2. URLにおいてユーザに整然とした印象を与えられる(URLが見やすくなる)


特に、一つ目のメリットが重要です。

ページ処理の際、バックエンドで実行されているプログラムが「PHP」なのか「Python」なのか「CGI」なのか特定されにくくすることで、ハッキング・クラッキングに微力ながら対処することができます。

また、例えばバックエンドのシステムをPHPからPythonに変更した場合、ブックマークしていたサイトにアクセスできないということを防ぐことができます。

さらに、拡張子が変更されることによって、自身のブログを気に入ってくれたリピーターさんに不便な思いをさせてしまうことを回避できます。

このように、セキュリティやユーザアビリティの観点からメリットがあるといえます。


拡張子を特定されないようにアクセスさせる

拡張子を特定できないようにすることで、ページを正常に表示できる拡張子が何なのかを分からなくできます。

これは、本来「http://hoge.com/index.html」というURLでしか表示されないページに対し、「http://hoge.com/index.php」や「http://hoge.com/index.py」でアクセスされた場合でも、「http://hoge.com/index.html」にアクセスしたものとして処理することをいいます。

また、「http://hoge.com/index.abc」や「http://hoge.com/index.wwww」など、そもそもウェブで使われている拡張子として相応しくないデタラメな拡張子でアクセスがあった場合にも有効です。

つまり、どんな拡張子でアクセスしようともページが正常に表示されるということです。

記述例2
1RewriteEngine On
2RewriteBase /
3
4RewriteCond %{REQUEST_FILENAME} !\.(css|js|jpg|jpeg|gif|png|xml)$ [NC]
5RewriteRule ^(.+)\.(.+)$ $1\.html


各行の説明


4RewriteCond %{REQUEST_FILENAME} !\.(css|js|jpg|jpeg|gif|png|xml)$ [NC]

アクセスがあったURLのファイル名に、CSS、JS、画像ファイル、またはXMLファイルでないときという意味です。


5RewriteRule ^(.+)\.(.+)$ $1\.html

任意の「ファイル名.拡張子名」でアクセスがあった場合、「ファイル名.拡張子名.html」と入力されたものとしてサーバに認識させるという意味です。


拡張子を特定されないようにするメリット

拡張子を偽装するメリットは、正常にページが表示される拡張子が何なのかを知られないようにすることです。

拡張子を省略しただけの場合、当てずっぽうにテキトーな拡張子でアクセスしたとき、ページが正常に表示されてしまうと正しい拡張子が何であるかが特定されてしまいます。

そこで、どんな拡張子でアクセスしてもページが正常に表示されることによって、バックエンドのシステムの正体を隠すことができるのです。


さいごに

今回は、.htaccessを使った拡張子を省略してサイトを表示する方法について見てきました。

「拡張子を省略」することと「拡張子を特定されないようにする」ことをセットで使ってみてください。

完全ではありませんが、セキュリティの向上に繋がるので、ぜひ活用してみてください。

それでは次回にお会いしましょう。