SSブログ

cookieでハマるハマる。 [cakePHP]

前回の記事で書いた、cookie。

cakePHPで保存したcookieのデータをjavascriptで読む事は出来た。

だけど、cakePHPで保存したCookieデータをjavascriptで上書きするのがどうにも上手く行かない。
同じ名前の別のcookieデータが出来ちゃう。

しかも、ディレクトリをルートに指定しても、保存したディレクトリの上層に行くと読めなくなる。
cookieムズイ。

よくよく考えたら、今まではドコモの携帯に対応するために、
cookieを使わずサイトを構築する事が多かったんだよね。


で、もう一つ。

これはローカルでは起きなかったが、サーバにアップしたら起きた問題。

cookieを保存する時に、サーバが?なのか良くはわからないですが、
エスケープを付けてしまう事。
ローカルでは無かったので、エラーになってビビる。

こちらは
$data = stripslashes($this->Cookie->read('cookie'));


という感じで読み出す時に stripslashes() 関数をつければ解消できた。

う〜ん。罠多いな。

今日は風邪ひきで体のあちこちが痛いが、
やらなきゃ行けない事も多い。もうひと頑張りだ。。

JavascriptでcakeCookieを読む [cakePHP]

cakePHPのソースの中で、

$this->Cookie->write('name',serialize($this->data),false,time()+259200);


みたいに書いてクッキーを保存したとします。
※ソースの詳細は省略します。

そちらのCookie情報をJavascriptで読み取るには、

function getCookie(name) {
    var ck = document.cookie.split(';');
    
    for (var i=0; i < ck.length; i++) {
        var res = ck[i].split('=');
        if ( res[0] == name ) { return decodeURIComponent(res[1]); }
    }
}


こんな感じのFunctionを作って、それを

var ck = getCookie('CakeCookie[name]');


で読み出せばOKだと思ったんだが、上手く行かない。


なんだろ?と思って、CookieをConsoleに書き出してみて、「もしや?」と気づく。

そうなんです。
「 name」
という感じで、nameの前に半角スペースが入ってるんですね。

なので、最初のコードでresをsplitして配列にしたすぐ後で、

res[0] = res[0].replace(/^\s+|\s+$/g, "");


とやって、両端に半角スペースがあったら取っ払う。
phpみたいにtrimが無いので正規表現使ってreplaseする訳ですね。


これで、取得できました。

Cookieはほんとに単なる文字列なんだなぁ。と改めて実感。
さて、もう一息がんばろ。


※cakePHPはvar1.3

Auth のあれこれ [cakePHP]

cakePHP1.3
Auth コンポーネントでいろいろハマッた。

どこでどうハマったかというと、
Auth のモデルを「User」以外のモノにする場合。

Authコンポーネントを使って、ACLを使わずに、
管理者とユーザーを使い分けた。

これが出来るのは、
管理者ページとユーザーページが完全に切り分けられているからで、
お客向けページの時にはAuthでつかうモデルをCustomerとし、
管理者向けページの時にはモデルをAdminにするみたいな感じ。

つまり、

お客向けページ:
$this->Auth->userModel = "Customer";

管理者向けページ:
$this->Auth->userModel = "Admin";

をそれぞれ
function beforeFilter(){
}
に書いておく事でOK。



のはずだったんだが、なんか上手く行かなくて。
Adminが実は予約語なんじゃないか?と疑ってみたり、
POSTした情報をアクション内でdumpしたら、passwordがnullになってて、
これが原因で認証されないのか?!などと疑ってみたが、Authのメソッド読んでもピント来ず。
よくよく考えたらこれはセキュリティーをふまえたAuthの仕様では?と気づいてみたり。。。

最終的に、原因は?? 

モデルの頭文字は必ず大文字で!
とか、そういう事だったりする。多分(T_T)

$this->Auth->userModel = "admin";
こうなったり
$this->Auth->userModel = "Admins";
こうなったりしてたんだね。

モデルは「s」とか大文字とかごっちゃになるが、
しかし、そこ間違えててもAuthのばあいエラーにならないみたいなんですよね。多分(T_T)

正直、いろいろやり過ぎて、
最終的にこれが原因だったのかどうか?自分でもよくわからない。




あとは、Authはハッシュに関して。

Security::hash()

ってのが有るが、これで作ったハッシュと、

$this->Auth->pasword()

で作ったハッシュは別物になるらしい。

ユーザー登録の時、メール認証などをかましてやる時に、
新規ユーザー登録のページに関しては認証掛ける必要も無いし、、
Authコンポーネントを読み込んでなかったので、
代わりに前者のSecurityクラスを使ったわけだが、それが失敗。


当然といえば当然なのかも?
だけど両方とも「sha1」でのハッシュ化だから同じになると思ったんだけどなぁ。
ちょっと違うんだろうな。。。
覚えとかなきゃ。


今回のお仕事でハマりそうなのはあと1〜2ヶ所。
そっちは javascriptとPHPの絡み。

早くこういうハマりポイント抜け出して、デザインの方やりたいわ。。





cakePHPを共用SSLで使う場合 #2 [cakePHP]

早速ですが、前記事の
通常のアクセスとSSLのアクセスをどう切り替えるか

に関して解決したのでこちらにメモ



簡単に言うとhtaccessへ追記で対応できました。
「RewriteCond 」で的確な条件を付けてあげれば良いんですね。


例えば通常の時のURLが、
http://ooooxxxxiiii.com/

で、共用SSLのURLが以下のように変わる場合
xxxxx25.xxxxx.co.jp/~hoge/


【方法】
インストールディレクトリのhtaccessなら

<IfModule mod_rewrite.c>

RewriteEngine on
RewriteBase /

#SSL
RewriteCond %{HTTP_HOST} ^xxxxx25.xxxxx.co.jp
RewriteRule ^$ ~hoge/app/webroot/ [L]

RewriteCond %{HTTP_HOST} ^xxxxx25.xxxxx.co.jp
RewriteRule ^(.*)$ ~hoge/app/webroot/$1 [L]

#nomal
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]

</IfModule>


こんな感じ。
赤いところが追記した部分ですが、#SSLのすぐ下の方だと、

「RewriteCond 」でHTTP_HOSTが「xxxxx25.xxxxx.co.jp」だった場合で、という条件を付け、
その条件にあった場合だけ
RewriteRule	^$ ~hoge/app/webroot/ [L]

を実行。以下のソースは読まない。

と言う意味になる。
条件が必要な場合「RewriteRule」毎に「RewriteCond」での条件設定が必要。

また、一つの「RewriteRule」に対して複数の「RewriteCond」を書ける。




ナルホドナルホド。

この条件文を、
インストールディレクトリ、appディレクトリ、webrootディレクトリのそれぞれのhtaccessに加えるというわけ。

ちなみに、webrootディレクトリのhtaccessだとこういう感じ。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

#SSL
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTP_HOST} ^xxxxx25.xxxxx.co.jp
RewriteRule ^(.*)$ ~hoge/index.php?url=$1 [QSA,L]

RewriteCond %{HTTP_HOST} ^xxxxx25.xxxxx.co.jp
RewriteRule ^$ ~hoge/index.php?url=index [L]

#Nomal
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
RewriteRule ^$ index.php?url=index [L]

</IfModule>



また、appディレクトリのhtaccessに関しては書き換えなくても動きました。
通常は無くても問題無いのかな?

でも、一応、同じように対応しておきました。




これでなんとか共用SSLへの対応は出来た。

あとは、必要なページではSSLアクセスに切り替わるようにソースをいじらんとかな。


以上。


(追記) 「RewriteBase /」 は、cakePHPのデフォルトでは入ってない。。と思う。 デフォのままだと /~hoge/app/webroot/ みたいに飛ばす先のURIの頭に「/」が必要かな?



cakePHPを共用SSLで使う場合 [cakePHP]

タイトルにも有りますが、
cakePHPを共用SSLで使う場合にハマったので記録。

共用SSLを使う場合、起こる事。
それはURLが、

http://ooooxxxxiiii.com/
などから

https://aaaabbbbcccc.com/~ooo/

などに変わってしまうという事。

これによって、ルートからの位置が変わってしまうので、問題がおきる。

ネットで探すと、この事から画像などが表示されなくなったなどの話が多く出てるが、
僕の環境の場合、

Not Found
The requested URL /home/oooo/public_html/app/webroot/index.php was not found on this server.

という感じのエラーになった。
んで、いろいろ検索、

やっと見つけたのがこちらの記事
http://d.hatena.ne.jp/SumiTomohiko/20061225/1167071865

非常に助かりました。

cakePHPのインストールディレクトリだけでなく、appディレクトリ、webrootディレクトリのそれぞれのhtaccessに「RewriteBase」を加えてあげないといけないのね。

さて、それは解決したが、
今度は、通常のアクセスとSSLのアクセスをどう切り替えるか、、だ。

出来たらまたこちらに記録します。


RewriteCondの話 [cakePHP]

はまったので覚え書き

cakePHPにて、インストールディレクトリ(cakePHPにおけるルートディレクトリ)には.htaccessがありまして、
その中身はというと

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
</IfModule>


のようになってます。



話は変わり、同じインストールディレクトリにフォルダを作って、cakePHPに関係ないhtmlやその他のフレームワークを入れたい場合なんてある訳で。。。
例えば、WordPressを「blog」フォルダにぶち込んで動かすなど。

これはつまり、

http://?????.com/***/

で、cakePHPの”***_controller”呼び出して、

http://?????.com/blog/

としたら「blog」フォルダ内に飛ばしたいって訳ですわ。



そんなとき、最初に書いた.htaccessにちょいと書き加える訳で、

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ app/webroot/ [L]
RewriteCond %{REQUEST_URI} !^/blog/.*
RewriteRule (.*) app/webroot/$1 [L]
</IfModule>


こんな感じで「RewriteCond」ルールに条件を付ければOK。

ちなみに、「!」は否定、「^」は先頭、「.*」は任意の文字の繰り返し、を表す。
正規表現に関して詳しくはGoogle先生に聞いてほしいw

この場合は「REQUEST_URIが”/blog/〜(*ワイルドカード)〜”の様なかたちではなかったら」下行のルールを適用という感じ。





で、話はここから。

以前cakePHPを載せたサーバでは上記の方法でちゃんと動いてたんですが、
今回載せるサーバでは、上記では「REQUEST_URIが”/blog/〜〜〜”の様なかたちではなかったら」という条件文として扱われない!
なんでだろ???

かなりいろいろ試して、頭が混乱して、このまま条件が付けられなかったらどうしよ〜〜、となってきた頃

先頭を表す「^」を削除したら出来ました。

つまり、
RewriteCond %{REQUEST_URI} !/blog/.* 

こんな感じ


解決はしたけど、理由はわからず。
サーバによって、正規表現の解釈が違うのか?はたまた、「REQUEST_URI」で返される値に若干の違いがあるのか?(この場合先頭に何かよけいな文字列が付くとか?)

後者のがあり得そうだが、原因の究明は出来ませんでした。


とにかくハマったのでメモメモ。(T_T)
わかる人が通りすがりに何か教えてくれたら有り難し。



ちなみにソースコードをブログにのせるための変換に
ブログでのソースコード表示
こちらのページを利用させていただきました。便利っす!ありがとうございます。

MySQLインポート時のメモ [MySQL]

今日、
MySQL5.6.4から
MySQL4.0.27への、データのエクスポート、インポートを試してました。

最初、シンプルにエクスポートしたデータので試したら、

MySQLのメッセージ: #1193 - Unknown system variable 'SQL_MODE'

なんて言われまして、
とりあえず検索しましたら、

どうやら、
4.1以降のMySQLから4.0以前へのMySQLへのポートの問題という事らしく、
解決法は、
sqlデータのエクスポート時に、サーバの互換性を「mysql323」として実行すればOKと。

僕はphpMyAdmin3.4.9を使ってますんで、
「エクスポート」→「エクスポートの方法:」→「詳細(ラジオボタンで選択)」
を選ぶと、互換性に関する項目があったので、ちょいっと選んでやってみた。

すると、またエラー。

だけどエラーが変わってる。

MySQLのメッセージ: #1193 - Unknown system variable 'time_zone'

??
time_zoneなんて変数知らんと?

ググるが、日本語のページでこれに関して書かれてる情報が見つからず、英語のページ見てもイマイチ解決法がわからず。

面倒くさいので、エクスポートしたsql形式のデータから、

SET time_zone = "+00:00";

ってのを、ざくっと削除して試してみたら、つるんとインポートできました。

なんなんだろう?
この問題が起こった人ってあんまり居ないみたいだし、
でも、このコードが無きゃいいってだけの話なら、なぜエクスポート時に書き出されるのか?

しかもタイムゾーン、
日本なら"+9:00"な気がするがそうでないことから機能してる感がない・・・w

まぁ良いか。
わからん。

「覚えておこう」なメモ書きだけがこのBLOGの目的だし。
以上。




ちなみに途中まで
サーバの文字コードがEUCと気づかんかった。

基本的な事に気づかなくハマったなんて時は
後のガッカリが増幅するので、ちゃんと気をつけよう。俺。



タグ:MySQL error

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。