htaccess機能を使ったページやサイトの転送

htaccessファイルは特別なファイルで、これを使ってサーバーの移転をしたり、ページの移転をしたり、スマートフォンとパソコンで見せるページを分けたりを簡単に実現することができます。

.htaccessファイルの特徴

サーバーの写真

.htaccess ファイルは、 サーバー楽天 の動作を制御する設定ファイルで、各ユーザーが、各ディレクトリ単位で設定できる特別なテキストファイルです。ファイル名が無く拡張子のみのファイルです。テキストファイルの為、FTPでのアップロードはテキストモードで行なう必要があります。

.htaccess ファイルは、設置したディレクトリおよびその下のサブディレクトリ全体に影響を及ぼします。

サーバーによっては.htaccess ファイルを設置できないところもあります。無料のホームページスペースでは置けないところが多いようです。

.htaccessを使ったスマートフォンサイトへの振り分け

スマートフォン用サイトとパソコン用のサイトを作って、スマートフォンでアクセスした人を自動でスマートフォンページへ飛ばす方法を紹介します。サイトのルートディレクトリに次のような内容の.htaccess ファイルを置きます。

しかし、この方法はスマートフォンでは普通のページも見られなくなります。最近はスマートフォンでパソコン専用のページを見る必要はないでしょう。

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (iPhone|Android.*Mobile|Windows.*Phone) [NC]
RewriteCond %{QUERY_STRING} !mode=pc
RewriteRule ^$ /m/ [R,L]

スマートフォンでトップページにアクセスするとユーザーエイゼント(HTTP_USER_AGENT)にiPhoneとかAndroid.*MobileとかWindows.*Phoneとかの文字列を含んでいると、http://ドメイン/m/ のファイルつまりトップページに飛ばすのです。フラグの[NC]は大文字と小文字の区別をしないという意味です。

!mode=pc は、アドレスの末尾に「?mode=pc」という文字列が付加されていない時だけに適用するという意味です。

「^$」の「^」は行の最初を、「$」は行の最後を表わします。つまり何も無い(http://ドメイン)つまり、トップページということです。「[R]」は転送の意味です。[L]は終わり、つまり最終行という意味です。

この方法はスマートフォンでトップページにアクセスしてきた場合だけスマートフォンのトップページに飛ばす方法です。それ以外は動作しません。

.htaccessを使ってトップページに飛ばす方法

私は使ったことがありませんが、時々「トップページ以外には直接リンクを禁止」と書いているサイトがあります。ホームページで公開しておきながら、HTMLファイルへの直リンクを禁止するのはおかしいとは思います。しかし、どうしてもこれをやりたい場合の参考になると思います。

上記の.htaccessを使ったアクセス制限(直リンク禁止、直接リンクを禁止)を使用してトップページ以外のファイルに対してアクセス制限(直リンク禁止、直接リンクを禁止)をします。

次に下記の.htaccessリダイレクトを使ったホームページの移転で述べている、存在しないファイルやエラーが出た時(403: Forbidden, 404: File Not Found)に、トップのページへ転送させる方法も適用します。

.htaccessを使ってトップページのアドレスを指定しない方法

トップページのアドレスは普通index.htmやindex.phpのようになっていて、ホームページのアドレスはhttp://example.net/と書いて、indexファイルを指定しないのが普通です。この方法だとindex.htmからindex.phpに変更しても、ホームページのアドレスを変更する必要はありません。

しかし、インデックスファイルを指定していなくても、検索にインデックスファイルを含んだページが登録されてしまうことがあります。SEOの点ではこれは好ましくないので、htaccessを使ってトップページのアドレスをindexファイルの無いものに統一しましょう。例えば、http://mydomain/index.phpにアクセスがあった場合にhttp://mydomain/に301で永久転送する方法です。

なお、これは他の設定によっては無限ループの可能性がありますので注意してください。ファイルの拡張子が、index.php または index.htm または index.html の場合は、ファイル名を取り去ってから、この内どれかのファイルがあれば、そこにアクセスします。条件はきびしく指定した方が間違いがありません。

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{THE_REQUEST} (^.*/index\.php|^.*/index\.htm)
RewriteRule ^(.*)index\.(php|htm) /$1 [R=301,L]

.htaccess301リダイレクトを使ったホームページの移転

ホームページを元のサーバーから今のに移転しました。ファイルもディレクトリ構造もほぼ同じなので、.htaccessファイルのリダイレクト機能で行なってみました。非常に簡単で効果的だったので紹介します。

もしこれを使わないと、100以上ある全てのHTMLファイルを変更して、新しいページへ転送する記述をしないといけません。つまり次のような記述を移転前の全てのページにします。CONTENT= の所を "0" にすると、永久的な移転となります。それ以外では、一時的な移転とみなされることがあります。

<html>
<head>
<meta HTTP-EQUIV="Refresh" CONTENT="0;URL=http://hoge.jp/*****.htm">
</head>
</html>

これと同じ動作をさせるものを、.htaccessファイルひとつで簡単に作ることができます。つまり次の記述をした .htaccess ファイルを元のサーバーのルートディレクトリに作成します。

Redirect permanent / http://hoge.net/
ErrorDocument 404 http://hoge.net/
ErrorDocument 403 http://hoge.net/

この1行目で、元のサーバーのルート・ディレクトリ以下のファイルにアクセスがあると、 http://hoge.net/ の中のファイルに直接転送(リダイレクト)されます。

2~3行目は、元のサーバーにアクセスしても存在しないファイルやエラーが出た時(403:Forbidden, 404: File Not Found)にも、トップのページへ転送が行なわれるようにする為です。

この2~3行目の記述は新しい移転先サーバーでも使えます。つまりルートディレクトリにこの2~3行目を記述した.htaccessファイルを置けば、それ以下で起こったエラーでは http://hoge.net/ のトップページに転送されます。しかし、404や403のエラーが起こった時は404.htm 403.htmを見せるのが本来のやり方ですので、本来のやり方の方を推奨します。

この方法はHTMLファイル名を変更したり、削除した場合でも、トップページへ飛ばすことができて非常に便利です。もちろん.htaccess の使えないサーバーではこの方法は使えません。

一般的に、ファイルが存在しない場合で、404リダイレクトでファイルが存在しない事を伝える場合は、次のようにhttpから記述せず、404.htmにリダイレクトします。前記の方法では404になりません。

ErrorDocument 404 /404.htm

Redirect 301と記述する方法も実験

htaccessを使ってRedirect 301と記述する方法(ファイルの永久移転)を使ってファイルの転送も試してみました。htaccessファイルに次のように記述しました。View HTTP Request and Response Headerを使ってちゃんとHTTPステータスコード301で転送されているかどうか確認しましょう。

redirect 301 /earth.htm http://hoge.net/***/hogehoge.htm

ファイルの拡張子をhtmからphpへ変更(永久移転)

私は.htaccessを使用してhtmlファイルをPHPで動作させる方法を使っていました。PHPを動作させるファイルの拡張子をphpだけでなくhtmやhtmlでも使えるようにするには.htaccessファイルに次の行を追加します。

AddType application/x-httpd-php .htm .html

しかし、いつまでもhtmlファイルを使っていたら、Expression Web3 でファイル保存時に拡張子が違うというエラーになる等の不都合を感じるようになりました。そこで、全ファイルの拡張子をhtmからphpへ変更したので、ファイルの永久移転(301移転)を.htaccessで設定しました。全てのhtmの拡張子をphpに変更してから次のように設定しました。

DirectoryIndex index.php index.html
RedirectMatch permanent (.*)\.htm$ $1.php

DirectoryIndex はXrea と Coreserver では使わないようにとのことですので、私は現在は次のようにしています。

RewriteCond %{THE_REQUEST} !(^.*/index\.htm)
RewriteCond %{THE_REQUEST} ^.*\.htm
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)\.htm /$1.php [R=301,L]

これは、index.htm と index.html 以外の htm と html 拡張子を、もしファイルが無ければ php に変更するものです。この場合も条件をちゃんと指定します。これは拡張子を間違えて入力した場合でも php のファイルがあれば表示しますので便利です。

サイトのディレクトリーの一部変更

サイトを運営していると、ディレクトリーの一部を削除したり、ディレクトリー名を変更したりすることがよくあります。変更した以降のディレクトリーやファイル内容が同じ場合のファイルの転送方法は次のようにします。例として、http://hoge.jp/abc/***.htmlをhttp://hoge.jp/def/***.htmlに変更した場合です。

RewriteCond %{THE_REQUEST} ^.*/abc/.*
RewriteRule ^abc/(.*) /def/$1 [R=301,L]

ここで注意することは、RewriteRule の "^" の後には "/" を書いてはいけないということです。また、この後の書き換えでは "/" が必要なことです。

wwwの有無にかかわらずアクセスできるサーバーの設定

私の使っているサーバーでは、http://mydomain/ だけでホームページが表示されて、http://www.mydomain/ ではホームページの表示ができませんでした。

wwwが有る場合と無い場合の両方で表示できるようにならないものかと思って色々やっていたら、うまくできるようになりました。それはサブドメインとして、www.を登録する方法です。

つまり、ドメインの設定でサブドメインに www.mydomain を登録して、 http://mydomain/ に転送を設定するだけです。ただし、この方法は302移転になることを確認しました。