.htaccessで、拡張子.htmlのままPHPを実行する方法

読者の方から、こんな質問をいただきました。

自分のサイトの全ページの拡張子を、「.htmlから.php」に変更したのですが、index.htmlからindex.phpにリダイレクトさせたほうがいいのでしょうか?
それとも特に何もしなくてよいのでしょうか?
自分は.htmlのページは全て消して、.phpのページをアップロードしました。

ページランクなど長年培って獲得した情報がリセットされるのは困ります。

最初に思ったのが、「変更する前に質問してほしかった」です。

拡張子と言えど、URLが変更されることに変わりはありません。

「URLが変わる = 別ページ」です。

www.suzukikenichi.com/abc.html と
www.suzukikenichi.com/abc.php は、

たとえコンテンツが100%同じでも、サーチエンジンにしてみたら別ページなのです。

つまり、それまで蓄積されたPageRankなどの情報が自動的に引き継がれることはなく、まったくの新規ページとして認識されます。

質問をいただいた方は、「(301)リダイレクト」の利用を検討しています。

たしかにそれも1つの手段です。

しかし、301リダイレクトで、旧URLから新URLへ情報が完全に渡される保証はどこにもありません(SEOmozのRand Fishkin氏は、リダイレクトでリンクジュースの1~10%くらいが失われるようだとコメントしています)。

それにサイトのページ数が多いと、新しいURLに移行するまで時間がかかり、一時的とはいえランキングの下降もあり得ます。

では、どうするべきかというのがこのエントリの主題です。

「拡張子が、.htmlのままでPHPが動くように設定する」

これがベストの対処法です。

拡張子が.html(または、.htm)の状態で、PHPスクリプトを実行させるには、.htaccessに次のいずれかの記述を追加します。

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

AddHandler application/x-httpd-php .php .html

.htmでHTMLファイルを作成しているときは、上の記述の最後を、.htmlではなく、.htmに変えてください(よくわからなければ、「.php .html .htm」と3つ書いてください)。

どちらの記述が有効かは、使っているサーバーの構成によって違ってきます。
試してみるか、レンタルサーバーの場合は問い合わせてください。

また、場合によっては次の記述が必要になるときもあります。

php_flag allow_url_fopen on
php_flag allow_url_include on

AddType/AddHandlerの記述を利用すると、拡張子が.html/.htmのファイルでもPHPが走るようになるのです。

HTMLファイル内では、PHPコードを普段通りに記述します。
何も特別な変更は必要ありません。

これで、拡張子が.htmlのまま、つまりURLを変えることなくPHPを実行できます。

もし、すでに拡張子を.phpに変更してしまっていて、時間がかなり過ぎ、変更後のページにもリンクが集まりだしたとか、元に戻すことは困難だとかいう場合には、301リダイレクトで転送をかけるほかありません。

サイト内のすべての拡張子.htmlファイルを、拡張子.phpファイルにリダイレクトします。

ただし、拡張子のみの変更で、ファイル名を変えないことが前提です。

.htaccessに次のように記述します。

RewriteEngine on
RewriteRule ^(.*).html$ /$1.php [R=301,L]

.htmを.phpに変更するときは、2行目のhtmlをhtmに置き換えてください。

ちなみにこの記述は、「.html/.htm ⇒ .php」への書き換えだけでなく、「.htm ⇒ .html」の書き換えにも使えます。

PHPを使用するために、.htmlから.phpへ拡張子を変更することは推奨しません。

理由は、URLの変更につながるからです。
URLの変更は、別の新しいページの追加になります。

形を変えずに、中身をいじって、PHPが動くようにしてください。

301リダイレクトで、.htmlで終わるURLを.phpで終わるURLに転送する方法がありますが、次善の策になります。

【補足1】
このエントリでは、.htaccessでの設定を説明しました。
host.conf、またはvhost.confで設定する方法もあります。
ただこちらは利用できない環境の場合もありそうなので、省略します。

【補足2】
301リダイレクトによる拡張子の書き換えの記述は、一例です。
別の記述もあります。