ラベル Apache の投稿を表示しています。 すべての投稿を表示
ラベル Apache の投稿を表示しています。 すべての投稿を表示

2012-06-19

【PHP】PC用・スマートフォン用・携帯用のページ振り分けする方法

PC、スマートフォンおよび携帯電話のページを自動的に切り替える方法を考えてみました。
SEO的にどのような影響が出るかはわかりませんw


◆仕様
・(1)切り替え用のプログラムは、公開しているディレクトリ直下に置く
・レスポンスされるHTMLを生成するプログラムは公開されていないディレクトリに、「pc/」、「smart/」および「mobile/」という名前にしておく
・レスポンスされるHTMLを生成するプログラムは、(1)に置いてある切り替え用のプログラムで読み込む(インクルードする)
・PC用ページは「/pc」以下のURLでアクセスする
・スマートフォン用ページは「/smart」以下のURLでアクセスする
・携帯電話用ページは「/mobile」以下のURLでアクセスする
・振り分けのは「ユーザエージェント」を検査して行うものとする



参考)ディレクトリ構成
├─public/ (公開ディレクトリ)
│  │
│  ├foo.php(振り分けプログラム1)
│  └bar.php(振り分けプログラム2)
│
└─template/ (非公開ディレクトリ))
    │
    ├─pc/
    ├─smart/
    └─mobile/
        │
        ├foo.php (携帯HTML生成用プログラム1)
        └bar.php (携帯HTML生成用プログラム2)
          ※この2つのプログラムはpc/、smart/ディレクトリにも存在する。



◆.htaccess
mod_rewriteを使用して、/pc、/smart、/mobileにアクセスしてきたリクエストを仕様の(1)にアクセスさせます。
例として、
---
RewriteRule /pc/([a-zA-Z\.]+)$ /$1
RewriteRule /smart/([a-zA-Z\.]+)$ /$1
RewriteRule /mobile/([a-zA-Z\.]+)$ /$1
---
といった感じでしょうか。

◆振り分けプログラムのすること
振り分けを厳密にするのは大変なので、今回はユーザエージェントを使用して振り分けすることにします。
たとえば、以下のようなプログラムになるでしょう。


  define( 'PC',       0 );
  define( 'SMART',    1 );
  define( 'MOBILE',   2 );
 
  switch( true ) {
    case preg_match( '/DoCoMo/i',    $_SERVER[ 'HTTP_USER_AGENT' ] ):
    case preg_match( '/KDDI/i',    $_SERVER[ 'HTTP_USER_AGENT' ] ):
    case preg_match( '/J\-PHONE|Vodafone|SoftBank/i',  
      $_SERVER[ 'HTTP_USER_AGENT' ] ):
      define( 'USER',   MOBILE );
      break;
    case preg_match( '/Android/i',  $_SERVER[ 'HTTP_USER_AGENT' ] ):
    case preg_match( '/iPhone/i',   $_SERVER[ 'HTTP_USER_AGENT' ] ):
    case preg_match( '/iPod/i',     $_SERVER[ 'HTTP_USER_AGENT' ] ):
    case preg_match( '/iPad/i',     $_SERVER[ 'HTTP_USER_AGENT' ] ):
      define( 'USER',   SMART );
      break;
    default:
      define( 'USER',   PC );
  }


これを振り分けプログラムで判別し、それにあったHTML生成プログラムをインクルードすればOKです。
たとえば、


  switch( USER ) {
    case MOBILE:
      include( '/template/mobile/' . basename( __FILE__ ) );
      break;
    case SMART:
      include( '/template/smart/' . basename( __FILE__ ) );
      break;
    default:
      include( '/template/pc/' . basename( __FILE__ ) );
      break;
  }


というような感じになるでしょう。
HTMLを変更するときは、必要となるtemplate/以下のファイルを修正するだけでOKです。

2012-02-10

【Apache】Rewriteの設定方法

タイトルの通りなんですが、いわゆる「静的ページ(この言い方どうもしっくり来ないのは自分だけなのでしょうか?)」でWebページを構成したいときにも使います。
その設定方法についての説明です。

例としてAmazonのAPIを使用した商品紹介ページを考えます。

■仕様
・「本」カテゴリの「TIGER&BUNNY(タイガー&バニー) ~桂正和原画&ラフ画集成~」という商品のページ
・「本」カテゴリのSearchIndexは「Books」とする。
・「TIGER&BUNNY(タイガー&バニー) ~桂正和原画&ラフ画集成~」当商品のASINは「408908153X」とします。






■設計
仕様から、以下のようなURLを考えます。

1)パラメータつきのURL
  http://www.foo.com/item.php?s=books&a=408908153X

2)パラメータなしのURL
  http://www.foo.com/item/books/408908153X

今流行のURL形態にしようと思います。

■実装
実装は以下のような感じです。
1)「item.php」上のAタグ、HREF属性を上のパラメータなしURLに変更する。
2)www.foo.comドメインのトップディレクトリにある「.htaccess」にRewriteの設定を記述する。

■Rewriteの設定
やっと本番です。今の例の場合「.htaccess」は以下のようになるでしょう。

RewriteEngine on                                     // Rewrite設定有効化
RewriteCond %{REQUEST_FILENAME} !-f                  // リクエストに「実体」がある場合それを優先する
RewriteCond %{REQUEST_FILENAME} !-d                  // リクエストに「実体」がある場合それを優先する
RewriteRule /item/([a-zA-Z]+)/([0-9a-zA-Z]+)$ /item.php?s=$1&a=$2 [L]  // 実際の動作

RewriteRuleの「[a-zA-Z]」や「[0-9a-zA-Z]」、「()」「+」「$」は正規表現というものです。
意味は
・[a-zA-Z] → 「小文字のa~zまでと大文字のA~Zまでのどれか1文字」を表す
・[0-9a-zA-Z] → 「数字0~9、小文字のa~zまでと大文字のA~Zまでのどれか1文字」を表す
・() → 括弧で括られた部分をキャプチャして左から順に$1、$2という風に後から使えるようにする。
・+ → 直前のパターンが1文字以上続く、という条件
・$ → 行末の意味
などです。これらは「メタ文字」といいますが、詳しくは専門書でも見てください。説明が大変なんですw


これで多分、動くようになると思いますが実際はよくテストを行い確認をして使ってください。

ZenBack

WebMoney ぷちカンパ