さくらインターネットレンタルサーバにセットアップした際の2つの問題
さくらインターネットレンタルサーバにCakePHPをセットアップする方法はネットに各種情報がありますが、それらですぐには解決方法が見つからなかった点が2点ありました。
- mediaプラグインでアップした画像が表示されない
- データ保存前に Sanitize::cleanを行なっている場合、一部の文字がバックスラッシュされる
使用プラグインやSanitize処理に由来するものなので、発生するかどうかはソース次第です。
mediaプラグインの画像表示
これは、.htaccessの設定によるものです。
mediaプラグインの推奨設定として、app/webroot/media/.htaccessで以下のようにディレクトリへの直接アクセスを禁止している場合、
これがさくらインターネットレンタルサーバの設定に影響されて、画像が出ないエラーが発生するようです*1
Options -Indexes
この.htaccessファイルを削除すると解消されます。
削除しても、サーバの設定により、media/filtersなどディレクトリへの直接アクセスはエラーになるので、問題ありません。
保存データで一部の文字がバックスラッシュされる
フォームに入力→DB保存した文字列の一部の文字に、勝手にバックスラッシュが入ります。
さくらでは、magic_quotes_gpc がデフォルトOnなのでこれが怪しいかな?と一瞬思いましたが、私の場合 php.iniでOFFに変更済みだったので関係ありません。
「ソ」などの文字に発生するため、いわゆる「SJIS関連」のエスケープであることが容易に推測されます。
コントローラ→モデル周りで$this->dataの変遷を見てみると、beforeSaveでSanitize::cleanをかけた後に発生していました。
var_dump($this->data); // エスケープされてない // Sanitize(不正コード、SQL Injection) $this->data = Sanitize::clean( $this->data, array( 'encode' => true, ) ); var_dump($this->data); // エスケープされている exit;
sanitize::clean()の中をさらに追うと、割と案の定、SQL特殊文字エスケープ処理で追加されていることがわかりました。
cake/libs/sanitize.php
if ($options['escape']) { $data = Sanitize::escape($data, $options['connection']); }
cake/libs/models/datasources/dbo/dbo_mysql.php
default: $data = "'" . mysql_real_escape_string($data, $this->connection) . "'";
MySQL関係が怪しいと踏んで、さらに調査すると、解決の手がかりになる記事を発見。
http://lab.klab.org/young/2008/11/symfony-%C3%97-mysql-%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E9%9D%A2%E7%99%BD%E3%81%84%E4%BA%8B%E8%B1%A1/
mysql_client_encoding() で調べてみると、MySQLの文字コードがsjisでした。
以下の追加で、サニタイズ前にMySQLの文字コードをセットしました。
app_model.php
function beforeSave($options = array()) { mysql_set_charset('utf8'); (中略) // Sanitize(不正コード、SQL Injection) $this->data = Sanitize::clean( $this->data, array( 'encode' => true, ) );
その他: .htaccessで RewriteBaseの設定
これは検索するとすぐ出てくる情報ですが、忘れるかも知れないので自分用にメモ
www/以下に webrootのみを設置するインストール方法の場合、.htaccessにRewriteBaseの設定追加が必要
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase /[設置ディレクトリ] ←追加 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] </IfModule>