.htaccess htmlファイルでphpやcgiを実行する方法(addtype・addhandler)
.htaccessのAddTypeやAddhandler構文を使えば、htmlのURLのままphpやcgiプログラムを実行する事ができます。
MIMEタイプでファイルの種類と関連付ける内容を設定すればhtmlファイル上でも問題なく動きます。
AddTypeやAddhandlerはセキュリティ上問題があるので部分的に利用するようにしましょう。
phpやcgiプログラムをhtml上で動かしたい
通常のhtmlページではphpやcgiなどのプログラムファイルを動かす事はできない事は既にご存知かと思います。
でももしhtmlソース内でphpプログラムが動くのであれば、WEBサイトをさらに機能的にできるはずですよね。
しかし基本的には拡張子が「.phpあるいは.cgi」のファイルでしか、phpやcgiのプログラムを使う事はできません。
強引に使う場合は、.htmlファイルの拡張子を.phpや.cgiへ変更しなければならなくなります。
拡張子が変えるとURLが変わってしまう
WEBサイトを運営していくにあたり大切な項目の一つが、「WEBページのURLは頻繁に変えない事」というのがあります。
URLを変えてしまうと、変更前のURLがそれまで持っていた価値(リンクポピュラリティなど)は、消失してしまうのです。
URLを変えたらそれまでのページ評価がゼロに
仮にリニューアルの時などにWEBページのURLを変えてしまったとしましょう(test.htmlをtest.phpなどに)。
拡張子を変えただけでもURLは立派に変わった事になります。
このまま放置しておくと、変更前のURLがそれまでGoogle等から受けていた検索上の評価がなくなってしまいます。
SEO対策上URLを変えたら評価の継承が必要
仮にそのページが検索上位に位置していた場合、その順位を一瞬にして失う事を意味します。
SEOの観点上、それは絶対に避けなければなりません。
なので.htaccessファイルで変更後のURLへリダイレクトを掛けるなどして、保持していた価値を失わない様に継承していかなければならないのです。
htmlファイル内でphpやcgiファイルが動けばいい
前置きが長くなりましたが、ページのURL(アドレス)は変える事無くプログラムを機能させる方法があります。
それはズバリ!それまでのURLを変えず「.html」のままで、phpなどのプログラムが動作するように設定をするのです。
.htaccessへ設定をする事でそれが可能になります。
具体的な.htaccessによる拡張子制御
拡張子で処理を切り替えている
ファイルには拡張子と呼ばれる、種類を分類するための単語がついています。
.htmlや.php、.cgiなどがそれにあたります。「.」ピリオドと英単語を組み合わせたものですね。
WEBサーバーはこの拡張子をもとに稼働タイプを判別して、その処理方法を自動的に切り替えているのです。
AddTypeを使う方法
「AddType」構文を使うことで、拡張子の処理方法がコントロールできるようになります。
.htmlを.phpとして実行するために下記の様に設定しましょう。
<FilesMatch "¥.html$"> AddType application/x-httpd-php .html </FilesMatch>
AddTypeの構文開設
1行目「<FilesMatch "¥.html$">」の部分は、アクセスされているファイルの拡張子が「.html」かを判断するために使っています。
2行目「AddType」がMIMEタイプを設定するという意味であり、次のようなルールで記述します。
AddType MIME-type extension1 extension2
各コードの説明
・AddType:MIMEタイプを設定するという宣言
・MIME-type:MIMEタイプの文字列(application/x-httpd-phpが今回入っています)
・extension:MIMEタイプを設定する拡張子、複数指定する場合は半角スペースで区切って指定する
上記の「AddType application/x-httpd-php .html」は「.html」のファイルに対し、「php」のMIMEタイプを関連付けるという意味になります。
これによりhtmlファイルであっても、サーバーはphpだと認識するのでphpプログラムを実行できるようになるのですね。
ちなみに拡張子は大文字小文字を区別しません。それに「.」ドットもあってもなくても大丈夫です。
エックスサーバーの場合
sv2000より上のサーバー番号の場合
ご自身が契約しているWEBサーバーのサーバー番号が2001(sv2001)以降なら、.htaccessに以下を記載してください。
AddHandler fcgid-script .html
上の書き方になった当初は一時的に.htaccessの初期設定が異なっていたので、FCGIWrapperなどの記載が必要でした。
しかし今は上の1行だけで大丈夫です。
sv2000より小さいサーバー番号の場合
契約しているWEBサーバーのサーバー番号がsv2001より下なら、.htaccessの記述は以下となります。
AddHandler x-httpd-php7.x .php .phps .html
記載するphpのバージョンには注意しましょう。
htmlでCGIの実行を可能にする場合
同様のルールでcgiファイルを稼働させる場合は以下の様になります。
Options +ExecCGI AddType application/x-httpd-cgi .html .htm
1行目:htaccessを配置したディレクトリを、cgiプログラムが実行できる領域に設定
2行目:拡張子が.htmlや.htmlのファイルを、cgiのスクリプトとして認識
htmlでSSIの実行を可能にする場合
Options +Includes AddType text/x-server-parsed-html .html .htm
1行目:htaccessを配置したディレクトリをSSI(Server Side Including)を実行できる領域に設定
2行目:拡張子が.htmlや.htmのファイルにおいてSSIを有効化
※本来SSIは.shtmlファイル上でしか動かない機能です。
CGI・SSIの実行を可能にする場合
となれば、上記二つを同時に指定する場合は以下のようになりますね。
Options +ExecCGI +Includes AddType application/x-httpd-cgi .html .htm AddType text/x-server-parsed-html .html .htm
あわせて読みたい参考記事
MIMEタイプ(MIME-type)とは?
MIMEタイプとは「ファイルの種類を伝えるための仕組み」の事です。
例えばWindowsであれば、拡張子でファイルの種類を識別する事ができますが、WEBサーバーにはそのような仕組みが基本的にありません。
ですのでこのMINIタイプでファイルの種類を伝える必要があります。「タイプ/サブタイプ」で構成します。
WEBサーバーで使われるMIMEタイプの例(これ以外にもたくさんあります)
MIMEtype | 種類 | 例 |
---|---|---|
text | テキストファイル | text/x-server-parsed-html text/css text/html…など |
image | 画像ファイル | image/gif image/jpeg image/png image/svg+xml…など |
audio | 音声ファイル | audio/wave audio/wav audio/ogg…など |
video | 動画ファイル | video/webm video/ogg…など |
application | バイナリーデータ | application/x-httpd-cgi application/x-httpd-php application/ruby application/rdf+xml…など |
AddHandlerを使う方法
AddHandlerは、MIMEタイプを設定する方法とは違いますが同様の動作をします。
.htaccessでは次のように記述します。
<FilesMatch "¥.html$"> AddHandler php7-script .html </FilesMatch>
2行目「AddHandler」とは、動作の種類を設定するという意味です。
AddHandlerは次のようなルールで記述します。
AddHandler handler-name extension1 extension2
・AddHandler:ハンドラ(動作の種類)を設定するという宣言
・handler-name:ハンドラの文字列(php7-scriptの部分)
・extension:ハンドラを設定する対象の拡張子、複数指定する場合は半角スペースで区切って指定する
上記での「php7-script」とは、PHP7を使用するという意味です。
phpのバージョンや書き方についてはサーバーごとのルールがありますので、WEBサーバーの仕様にあわせて変更しましょう。
上記の記述により.htmlのファイルでphpプログラムが動作するようになります。
http.confを編集できる場合
WEBサーバーのhttp.confが編集できる場合は、最後の行に以下を追加します。
この場合.htaccessへ記述をする必要はありません。
・AddType application/x-httpd-php .php .html
もしくは
・AddHandler application/x-httpd-php .php .html
Apacheを再起動すれば.htmlのファイルでphpプログラムが実行できるはずです。
.htaccessによる拡張子操作のデメリット
ここまでAddTypeおよびAddHandlerによる設定を解説しましたが、この手法には2つのデメリットがあります。
1つ目:サーバー負荷が掛かる
まずは前提として全てのhtmlファイルがphpファイルとしても解釈されるのでサーバー負荷が掛かり、速度も多少落ちます。
ただし今はWEBサーバー側も高性能なスペックを用意しているところが多くなってきたので、必要以上に気に掛ける必要は無いと思います。
2つ目:セキュリティの問題
もう一つの問題が重要でセキュリティに関するものです。
本来ApacheのAddHandlerは、セキュリティ上の懸念から使用すべきではないとされています。
AddTypeやAddHandlerには下記のような認識仕様があります。
誤認:拡張子が複数あるファイル
それは「.」ドットで繋いだ文章を「拡張子が複数あるファイルと解釈する」というものです。
例えば「test.php.html」というファイルの場合「.php」と「.html」という2つの拡張子を持つファイルと認識してしまいます。
つまりphpプログラムとして実行しつつ、HTMLファイルとしても読込をするのですね。
どのようなケースで危険なのか
例えばお問合せの入力フォームなどでファイルを添付して送信する機能があったとしましょう。
そこに「test.php.txt」や「test.php.jpg」といった「.」が連続するファイルが添付で送られたらどうなるでしょうか。
悪意あるスクリプトを実行してしまう可能性
この場合「test.php」の部分を認識して、「phpプログラム」として送信したファイル内を実行してしまう可能性があるのですね。
もし悪意ある第三者がtest.php.txtの中に悪質なスクリプトを書いていた場合、WEBサイトの破壊・改ざん、乗っ取り被害にあう危険性があるのです。
まとめ
そもそも全てのhtmlファイルでphpやcgiプログラムを実行するのは良くないと思います。
セキュリティを考慮するなら、あえて拡張子自体を.phpに変更する(URLを変える)べきだと私は思います。
手間は掛かりますが、変更元URLから変更先URLへとhtaccessでリダイレクトを掛ければ問題は無いのです。継承し終わったら削除できますしね。
どうしても使いたいなら全てではなく、拡張子やディレクトリ・ファイルを限定する使い方をしましょう。