.htaccessの具体的なサンプル

.htaccess の利用方法として目的毎に具体的な .htaccess の書き方のサンプルをご紹介します。リダイレクト、正規化、拡張子の省略に、IP制限ついて試してみます。

(Last modified: )

.htaccessを使ったリダイレクト

最初に .htaccess を使ってリダイレクトの設定を行う方法です。

ファイル単位でリダイレクトする

ファイル単位でリダイレクトを行う場合です。 .htaccess があるディレクトリと同じディレクトリにある old.html へのアクセスがあった場合に、新しい URL へリダイレクトする場合は次のように記述します。

RewriteEngine on
RewriteRule ^old.html$ http://www.example.com/new.html [L,R=301] 

同じサイトにある /other/new.html へリダイレクトする場合は次のように記述します。

RewriteEngine on
RewriteRule ^old.html$ /other/new.html [L,R=301] 

ディレクトリ単位でリダイレクトする

ディレクトリ単位でリダイレクトする場合です。指定したディレクトリに含まれるすべてのファイルへのアクセスを、新しいサイトの中の指定したディレクトリへ同じファイル名でリダイレクトします。 .htaccess があるディレクトリの中にある olddir ディレクトリへのアクセスがあった場合に、新しい URL の newdir ディレクトリへリダイレクトする場合は次のように記述します。

RewriteEngine on
RewriteRule ^olddir/(.*)$ http://www.example.com/newdir/$1 [L,R=301] 

同じサイトにある /other/newdir へリダイレクトする場合は次のように記述します。

RewriteEngine on
RewriteRule ^olddir/(.*)$ /other/newdir/$1 [L,R=301] 

ドメイン単位でリダイレクトする

ドメイン単位でリダイレクトする場合です。ドメインに含まれるすべてのファイルへのアクセスを、新しいサイトへ同じファイル名でリダイレクトします。 .htaccess はドキュメントルートに配置してください。 www.example.jp へのアクセスをすべて www.example.com へリダイレクトする場合は次のように記述します。

RewriteEngine on
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

.htaccessを使ったURLの正規化

次に .htaccess を使って URL の正規化を行う方法です。

wwwなしをwwwありに正規化する

www なしを www ありに正規化する場合です。 example.com を www.example.com へ正規化します。ドキュメントルートに設置した .htaccess で次のように記述します。

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

逆に wwww ありを www なしに正規化する場合です。 www.example.com を www.example.jp へ正規化します。

RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

index.htmlありをindex.htmlなしに正規化する

index.html ありでアクセスした場合に index.html なしへ正規化する場合です。 http://www.example.com/dir/index.html を http://www.example.com/dir/ へ正規化します。ドキュメントルートに設置した .htaccess で次のように記述します。

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

index.html だけでなく index.php も同じように正規化する場合には次のように記述します。

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

httpへのアクセスをhttpsでのアクセスに正規化する

http でのアクセスを SSL/TLS を使った https でのアクセスに正規化する場合です。 http://www.example.com/ へのアクセスを https://www.example.com/ へ正規化します。ドキュメントルートに設置した .htaccess で次のように記述します。

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

逆に https でのアクセスを http でのアクセスに正規化する場合です。

RewriteEngine on
RewriteCond %{HTTPS} on
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

.htaccessを使った拡張子の省略

次に .htaccess を使って拡張子の省略を行う方法です。

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

拡張子を省略してアクセス可能とすることで、例えば 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 だけでアクセスすることが可能となります。

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

複数の種類の拡張子を省略できるようにするには次のように記述します。下記は .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 の内容が返されます。

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

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

このままですと拡張子なしの /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 へリダイレクトしています。無限ループにならないように注意してください。

.htaccessを使ったIP制限

最後に .htaccess を使って特定の IP アドレスからのアクセスの許可またはアクセスの拒否を行う行う方法です。

ディレクトリへのアクセスを特定のIPアドレスからのみ許可する

特定のディレクトリへのアクセスを特定の IP アドレスからのみ許可する場合は次のように記述します。

Require ip 192.168.128.0

.htaccess を IP 制限を行いたいディレクトリに設置してください。

複数の IP アドレスに許可する場合は、スペースを挟んで続けて IP アドレスを記述します。

Require ip 192.168.128.0 10.1.1.0

特定のIPアドレスからのディレクトリへのアクセスを許可しない

特定のディレクトリへのアクセスを特定の IP アドレスから拒否する場合は次のように記述します。

Require not ip 192.168.128.0
Require all granted

複数の IP アドレスからのアクセスを拒否する場合は、スペースを挟んで続けて IP アドレスを記述します。

Require not ip 192.168.128.0 10.1.1.0
Require all granted

-- --

.htaccess を使ったリダイレクトを行うサンプルを紹介しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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