風柳メモ

ソフトウェア・プログラミング関連の覚書が中心。

お名前.comの共用サーバーSDで拡張子htmlをPHPとして実行する方法

承前

お名前.comの共用サーバーSDで*.htmlからPHPを実行する方法 - 風柳メモ

では、

  1. CLI SAPIを使用する方法
  2. SSI で外部 PHP ファイルを使用する方法

について書いたが、どちらも今一つ使い勝手がよくなかった。


今回の方法を使うと、

  • *.html に対しては特にパーミッションの設定変更(実行アクセス権の付与)や先頭行(shebang)の追加は不要
  • *.html 内に <?php 〜 ?> を複数記述でき、かつ、各記述間でグローバル変数等も共有可
  • $_GET、header() 等も有効

と、通常の *.php ファイルと全く同様に使用可能。

CGI-Wrapper を使う方法

要点は、

  1. CGI SAPI版 PHP を呼び出す CGI-Wrapper スクリプト(php.cgi)を用意し、Web 用ルートディレクトリに設置(パーミッションは700もしくは705)
  2. .htaccess にて、拡張子 html に対して独自ハンドラタイプ(myphp-cgi)を定義し(AddHandler)、当該ハンドラタイプに対して CGI-Wrapper スクリプトを実行するように設定(Action)

のようになる。


以下は当方で動作確認できた例。

php.cgi (CGI-Wrapper)
#! /usr/bin/bash
exec /usr/local/bin/php-cgi
  • Web 用のルートディレクトリに設置(他の場所に置く場合、.htaccess の Action も併せて変更要)
  • パーミッションは 700(もしくは705)に設定
.htaccess
# ハンドラタイプ myphp-cgi に対して CGI-Wrapper(php.cgi) を実行
Action myphp-cgi /php.cgi
#AddHandler myphp-cgi .html
# 拡張子がhtmまたはhtmlの全ファイルをPHPとして解釈するとサーバに負荷がかかるため、
# ファイル名でフィルタして最小限に絞る(例はindex.htmとindex.htmlのみ対象)
<Files ~ "^index\.html?$">
  AddHandler myphp-cgi .html .htm
</Files>
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>[PHP(CGI)]テストページ</title>
</head>

<body>
<h1>拡張子htmlのファイルでPHPを実行するテスト</h1>
<h2>PHP実行結果</h2>
<?php
$param_list = array();
foreach ($_GET as $key => $val) {
	$val = is_array($val) ? ('array(' . implode(", ", $val) . ')') : $val;
	$param_list[] = htmlspecialchars($key . '=' . $val, ENT_QUOTES);
}

$param_str = implode("\n", $param_list);

$out_str = <<< _EOT_
<p>PHPを実行しました!</p>
<h3>クエリ(\$_GET) 一覧</h3>
<pre>{$param_str}</pre>
_EOT_;

echo($out_str);
?>
</body>
</html>