月別アーカイブ: 2012年11月

.htaccess www index あり・なし統一

ここでは.htaccessでwwwやindex.html、index.phpを統一する方法を解説していきます。

apache

wwwをなしに統一

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com
RewriteRule (.*) http://example.com/$1 [R=301,L]

wwwをありに統一

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

index.htmlをなしに統一

RewriteEngine On
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ http://example.com/$1 [R=301,L]

index.phpの場合はindex.htmlの箇所をindex.phpに置き換えてください。

CakePHPでURLの統一

/app/webroot/.htaccess

<ifmodule mod_rewrite.c="">
    RewriteEngine On
    # wwwなしに統一
    RewriteCond %{HTTP_HOST} ^www\.example\.com
    RewriteRule (.*) http://example.com/$1 [R=301,L]
    # /indexなしに統一
    RewriteCond %{THE_REQUEST} ^.*/index
    RewriteRule ^(.*)index/$ http://example.com/$1 [R=301,L]
    # 以下はCakePHPのまま編集しない
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</ifmodule>

なかなか変更されない場合はブラウザのCookieやキャッシュを削除してから確認してください。

CakePHP2.x SessionをDBに保存

ここではCakePHP2.xでのSessionの保存先にデータベースを使用する方法を解説していきます。

cakephp

core.phpの編集

/app/Config/core.php

Configure::write('Session', array(
        'defaults' => 'database',
        'ini' => Array(
                //ブラウザを閉じた時にセッションを破棄
                'session.cookie_lifetime' => 0, 
        )
));

defaultsにdatabaseを設定、他にはphp、cakeなどがあります。

Session保存用のテーブル作成

/app/Config/Schema/sessions.sql

CREATE TABLE IF NOT EXISTS `cake_sessions` (
    `id` varchar(255) NOT NULL DEFAULT '',
    `data` text NOT NULL,
    `expires` int(11) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

これだけでSession情報がDBに登録されるようになります。

.htaccess Basic認証

ここでは.htaccessでベーシック認証をかける解説をしていきます。

apache

.htaccessサンプル

AuthType Basic
AuthName "Input your ID and Password."
AuthUserFile /home/passwd.dat
require valid-user

解説

AuthName (2行目)
ウインドウに表示される文字を指定してください。

AuthUserFile (3行目)
IDとPassを格納したファイルまでサーバルートディレクトリからのフルパスで指定してください。

Basic認証パスワード暗号化

http://orange-factory.com/tool/crypt.cgi
オレンジ工房様

passwd.datファイルを作成

beet:nfDhFdbuMkL0.

例ではIDがbeetでパスワードがtakeshiです。

.htaccessとpasswd.datファイルをアップロードして完了です。

PHP ランダムに確立指定する

ここではPHP rand();関数に確立を設定するサンプルソースを記載しています。

サンプルソース

<?php
  
    $configs = array(
            array(
                    'probability' => 60,
                    'message' => '60%の確率で表示されます。'
            ),
            array(
                    'probability' => 30,
                    'message' => '30%の確率で表示されます。'
            ),
            array(
                    'probability' => 10,
                    'message' => '10%の確率で表示されます。'
            )
    );
  
    $count = count($configs);
    $max = 0;
  
    for ($i = 0; $i < $count; $i++) {
        $max += $configs[$i]['probability'];
    }
  
    $rand = rand(1, $max);
    $from = 0;
    $to = 0;
    $result = '';
  
    for ($i = 0; $i < $count; $i++) {
        $from = $to;
        $to += $configs[$i]['probability'];
  
        if ($from < $rand && $rand <= $to) {
            $result = $configs[$i]['message'];
        }
    }
  
    echo $result;

解説

probabilityの数値が大きいものを高確率で出しています。
数値の合計が100を超えたとしても数値の大きいものが出力されます。

CakePHP2.x Controller作成

ここではCakePHP2.xのControllerの簡単な解説をしていきます。

cakephp

サンプルソース

<?php

    class IndexController extends AppController {
        // モデル
        public $uses = array('User');
        // コンポーネント
        public $components = array('Cookie');
   
        public function beforeFilter() {
            parent::beforeFilter();
            $this->set('title_for_layout', 'タイトル');
            $this->setCss();
            $this->setJavascript();
        }
   
        public function index() {
            // post判定
            if ($this->request->is('post')) {
                // POST値 <input name="post" type="text">
                $post = $this->request->data['post'];
                  
                // GET値 http://www.example.com/index?get=hoge
                $hoge = $this->request->query['get'];
                  
                // URLから渡されたデータ http://www.example.com/index/param1/param2
                $param1 = $this->request->pass[0];
                $param2 = $this->request->pass[1];
                  
                // モデルの使用 $this->ModelName->functionName();
                $this->User->getAll();
            }
   
            // 読み込むレイアウトの指定 app/View/Layouts/以下を指定
            $this->layout = 'admin/indexFrame';
            // 読み込むViewの指定 app/View以下を指定
            $this->render('/admin/index');
        }
   
        /**
         * ページ固有のCSS設定
         */
        private function setCss() {
            $arrCss = array();
            // app/webroot/css/以下を指定
            array_push($arrCss, 'admin/hage');
            array_push($arrCss, 'admin/foo');
            $this->set('arrCss', $arrCss);
        }
   
        /**
         * ページ固有のJavascript設定
         */
        private function setJavascript() {
            $arrJavascript = array();
            // app/webroot/js/以下を指定
            array_push($arrJavascript, 'admin/Index');
            $this->set('arrJavascript', $arrJavascript);
        }
    }

解説

public $uses = array(‘User’); (5行目)
使用するモデル名を配列で指定してください。

public $components = array(‘Cookie’); (7行目)
使用するコンポーネントを配列で指定してください。
※Sessionコンポーネントは指定しなくても読み込まれます。

public function beforeFilter() {} (9行目)
一番最初に実行されるブロックです。

parent::beforeFilter(); (10行目)
親クラスのpublic function beforeFilter() {}を実行する場合parent::beforeFilter();をコールしてください。

$this->set(‘title_for_layout’, ‘タイトル’); (11行目)
Viewファイルで使用する変数を設定します。

private function setCss() {} private function setJavascript() {} (42、53行目)
私の自作メソッドなので規約などはありません。

if ($this->request->is(‘post’)) {} (18行目)
POSTされたデータがあればtrueになります。

$post = $this->request->data[‘post’]; (20行目)
$_POST[‘post’]と同じ使い方です。

$hoge = $this->request->query[‘get’]; (23行目)
$_GET[‘get’]と同じ使い方です。

$param1 = $this->request->pass[0]; (26、27行目)
URLから渡されたデータ
URL/区切りで$this->request->pass[0]; 1,2,3・・・と格納されます。

$this->User->getAll(); (30行目)
コントローラー内public $uses = array(‘User’);で指定したモデル名->function名を使用します。
今回の例ではModelクラスにgetAllメソッドがあると仮定しています。

$this->layout = ‘admin/indexFrame’; (34行目)
Layoutファイル読み込み
/app/View/Layouts/から指定してください。

$this->render(‘/admin/index’); (36行目)
Viewファイル読み込み
/app/Viewから指定してください。