こんにちは。おもてうらです。
今回は、さくらインターネットのレンタルサーバ上にある自サイトをAMP化するにあたり、CSSの外部ファイルをphpを使ってhtml内に書き出したかったため、htmlファイル内でphpを実行する方法について調べた備忘録です。
html内でphpを動かす方法
通常のサーバー
大体のサーバーでは、以下の2行を.htaccessに記述すればOKです。
AddType application/x-httpd-php .php .html AddHandler application/x-httpd-php .php .html
さくらインターネットのレンタルサーバー
さくらのレンタルサーバーでは以下の手順が必要になります。
- 「php.cgi」「.htaccess」を作成
- ファイルをアップロードし、パーミッションを変更
①「php.cgi」の設定
まずテキストエディタで以下の2行を記述した「php.cgi」ファイルを作成します。
#!/bin/sh exec /usr/local/bin/php-cgi
これをウェブ公開ディレクトリ(/home/アカウント名/www/)以下の好きな階層にアップロードし、ファイルのパーミッションを「705」または「755」に設定します。
②「.htaccess」の設定
次にテキストエディタで以下の2行を書いた「.htaccess」ファイルを作成します。
Action myphp-script /php.cgi AddHandler myphp-script .php .html
1行目の「/php.cgi」が「php.cgi」の場所となります。この記述ではトップページと同階層にあります。仮にtestフォルダの中に入れたなら「/test/php.cgi」とします。
作成した「.htaccess」を、phpを実行したいhtmlファイルが入っているディレクトリにアップロードし、ファイルのパーミッションを「644」に設定します。(※通常は644になっています)
これで作業は完了です。htmlファイルにphpのコマンドを記述すれば実行できるはずです。
エラーが出た場合の対応方法
上記手順を実行してエラーが出た場合、原因は以下のどれかだと思います。
- 文字コード、改行コードが間違っている
- ディレクトリ、ファイルのパーミッションが間違っている
- アップロードの場所が間違っている
- アップロード方法が悪い
- ファイルの記述が間違っている
文字コード、改行コードが間違っている
「php.cgi」および「.htaccess」の 文字コードは「EUC-JP」、改行コードは「LF」にしてください。これ以外だとエラーになります。
参考:【さくらのレンタルサーバ】基本仕様 – さくらのサポート情報
WEB上のソースコードをコピペした場合や、メモ帳などで編集した場合に陥りやすいです。Terapad等を使用して文字コード、改行コードともに指定して保存するか、レンタルサーバー備え付けのファイルマネージャーで編集するのが確実です。
ディレクトリ、ファイルのパーミッションが間違っている
「php.cgi」のパーミッションは「705」か「755」、「.htaccess」のパーミッションは「644」にしてください。
念のため、両ファイルをアップロードしたフォルダのパーミッションも確認してください。(※フォルダは通常705か755です。)
アップロードの場所が間違っている
以下のエラーメッセージが出た場合は、ファイルの場所が間違っています。
The requested URL /php.cgi/index.html was not found on this server.
「.htaccess」の1行目の記述が、きちんと「php.cgi」の場所になっているかを確認してください。またファイルがきちんとアップロードされているか確認してください。
アップロード方法が悪い
FTPソフトでファイルをアップロードする際には、転送モードをバイナリーモードにしてください。
よくわからなければ、レンタルサーバー備え付けのファイルマネージャーでアップロードするのが確実です。
ファイルの記述が間違っている
「php.cgi」「.htaccess」に記述ミスや余計な文字が無いことを確認してください。
またhtml内に記述したphpのコマンドが間違っていないかも確認してください。
その他の注意事項
国外IPアドレスフィルタについて
国外IPアドレスフィルタを有効にしている場合、「php.cgi」を導入したことで、これを利用したhtmlファイルに対して海外IPアドレスから閲覧ができなくなります。
参考:国外IPアドレスフィルタを有効にすると、全てのウェブページでアクセスが拒否されます – さくらのサポート情報
フィルタを無効化することで解消できますが、セキュリティ面での脆弱性が出てくる可能性があります。フィルタを有効にしていても、Googleなど一部の検索エンジンボットは通常通りアクセスできるようです。
対応についてはマニュアルを参照のうえ各自の判断でやっていただければと思います。
Adobe Flash Playerの有効化
備え付けのファイルマネージャーを使用する際に、「Adobe Flash Playerをインストールしてください」と表示が出る場合があります。実際にインストールしても同じ表示が出る場合、「アドオン・プラグインの有効状態を確認」する必要があります。
Google Chromeの場合は以下の手順で有効化できます。
①ウェブアドレスの左側にある鍵アイコン または情報アイコン をクリックします。
②[Flash] の右側にある矢印アイコン をクリックします。
③[このサイトでは常に許可] を選択します。
④ページを再読み込みします。
アクセスログからエラー内容を調べる
「コントロールパネル」→「アクセスログの設定」→「エラーログの表示」と辿っていくと、サーバーのエラーログが確認できます。
アバウトな内容ですが、エラー発生の原因や発生元のファイルがわかるので便利です。
おわりに
今回は自サイトのAMP化対応にあたって、CSSの外部ファイルをphpを使ってhtml内に書き出したかったため、さくらインターネットのhtml内でphpを実行する方法を調べてみました。
AMP化の条件のひとつに「CSSを全てhead内に記述しなければいけない」というのがあるのですが、さすがに全てのAMPページにいちいちCSSのコードをコピペしていくのは面倒だったので、phpの組込コマンドを使うことにした次第です。
どうもさくらインターネットはPHPの動作モードがCGIであるために、本記事で紹介したような面倒な手順を踏む必要があるみたいです。国外IPアドレスフィルタの問題もありますし、もう少し柔軟に適用できたらなあと思いました。
コメント
php.cgi の記述ですが
exec/usr/local/bin/php-cgi
exec /usr/local/bin/php-cgi
ではないでしょうか?
>nakaさん
返信遅くなってしまい申し訳ありません。
ご指摘頂いた通り半角スペースが抜けておりました。
記事の方修正しておきます。
どうもありがとうございます。
こんなテクニックがあったのですねー
大変助かりました、ありがとうございます^-^
>Nanaseさん
お役に立ったようで良かったです。
最初からphpでサイトを作ってしまっても良いのですが、htmlベースのサイトにちょこっとphpの関数を使いたい場合などに重宝すると思います。