.htaccessサンプル:拡張子の省略

.htaccess を使って拡張子を省略して Web サーバへアクセスを可能にするサンプルをご紹介します。 filename.html や filename.php などのファイルに対して filename のみでアクセスする方法を解説します。

(Last modified: )

拡張子を省略してアクセス可能にする

拡張子を省略してアクセス可能とすることで、例えば hello.php へアクセスするときに hello だけでアクセスすることができるようになります。リクエストの末尾に .php を追加してリライトするだけであれば次のように記述できます。

RewriteEngine on
RewriteRule ^(.*)$ $1.php [L]

ただ hello というディレクトリが存在していたり、 hello という拡張子がないファイルが実際に存在していた場合には末尾に .php を追加するのではなくそのままアクセスするため、 RewriteCond ディレクティブを使って条件を追加します。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ $1.php [L]

さらにリクエストが示すファイルに拡張子 .php を付けたファイルがファイルシステムに実際に存在する場合だけリライトを行うため RewriteCond ディレクティブを使って条件をもう一つ追加します。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]

これで hello.php へアクセスするときに hello だけでアクセスすることが可能となります。

サンプルコード

それでは実際に試してみます。 www.example.com のドキュメントルートに設置した .htaccess の中で次のように記述しました。 /blog/hello.php へアクセスするときに /blog/hello でアクセスできるように設定します。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]

ブラウザから http://www.example.com/blog/hello へアクセスします。

拡張子を省略してアクセス可能にする(1)

http://www.example.com/blog/hello.php へリライトされて、 hello.php を実行した内容が画面に表示されます。

拡張子を省略してアクセス可能にする(2)

複数の種類の拡張子を省略する

複数の種類の拡張子を省略できるようにするには次のように記述します。下記は .php に加えて .html についてもファイル名だけでアクセスできるようにしています。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html [L]

hello.php と hello.html の両方のファイルが存在した場合には、先にリライトを行うように記述している hello.php の内容が返されます。

サンプルコード

それでは実際に試してみます。 /blog ディレクトリの中には hello.php hello.html bye.html の 3 つのファイルが設置されています。 www.example.com のドキュメントルートに設置した .htaccess の中で次のように記述しました。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html [L]

ブラウザから http://www.example.com/blog/hello へアクセスします。

複数の種類の拡張子を省略する(1)

http://www.example.com/blog/hello.php へリライトされて、 hello.php を実行した内容が画面に表示されます。

複数の種類の拡張子を省略する(2)

次にブラウザから http://www.example.com/blog/bye へアクセスします。

複数の種類の拡張子を省略する(3)

http://www.example.com/blog/bye.html へリライトされて、 bye.html の内容が画面に表示されます。

複数の種類の拡張子を省略する(4)

拡張子ありを拡張子なしに正規化する

先ほどまでの設定では、拡張子なしでアクセスした場合に、拡張子ありの URL へリライトされて表示されていましたが、拡張子を付けたファイルへアクセスしてもアクセスすることができました。

例えば先ほどの設定のまま http://www.example.com/blog/bye.html へアクセスすると、そのまま表示されます。

拡張子ありを拡張子なしに正規化する(1)

このままですと拡張子なしの /blog/bye でも、拡張子ありの /blog/bye.html でもアクセスが可能となります。問題なければこのままでもいいですが、拡張子なしに統一したい場合は正規化の設定を追加します。次の 2 行の設定を追加しました。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html [L]

RewriteCond %{THE_REQUEST} ^.*\.(php|html)
RewriteRule ^(.*)\.(php|html)$ http://www.example.com/$1 [R=301]

拡張子 .php または .html 付きでアクセスがあった場合は、拡張子なしの URL へリダイレクトしています。無限ループにならないように注意してください。

サンプルコード

それでは実際に試してみます。 /blog ディレクトリの中には hello.php hello.html bye.html の 3 つのファイルが設置されています。 www.example.com のドキュメントルートに設置した .htaccess の中で次のように記述しました。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html [L]

RewriteCond %{THE_REQUEST} ^.*\.(php|html)
RewriteRule ^(.*)\.(php|html)$ http://www.example.com/$1 [R=301]

ブラウザから http://www.example.com/blog/hello へアクセスします。

拡張子ありを拡張子なしに正規化する(1)

http://www.example.com/blog/hello.php へリライトされて、 hello.php を実行した内容が画面に表示されます。

拡張子ありを拡張子なしに正規化する(2)

次にブラウザから拡張子付きの http://www.example.com/blog/hello.php へアクセスします。

拡張子ありを拡張子なしに正規化する(1)

拡張子なしの http://www.example.com/blog/hello へリダイレクトされたあと、あらためて http://www.example.com/blog/hello.php へリライトされて、 hello.php を実行した内容が画面に表示されます。

拡張子ありを拡張子なしに正規化する(2)

-- --

.htaccess を使って拡張子を省略して Web サーバへアクセスを可能にするサンプルをご紹介しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。