トップページの判定・振り分けコード。<?php
//// リストはPCRE正規表現。デリミタは%に統一しておく。
//// PCRE正規表現以外の正規表現のメタ文字( ^ . \ + * ? [ ] ( ) $ など)は\でエスケープすること。
//// ブラウザの判定
// 通常の人間が使うブラウザの判定用リスト。frame,cookie,javascriptが使えることが最低条件。
// その他w3mとかあるようだが確認できてないので除く。
$BrowserList = '%(MSIE|Firefox|Safari|Opera|Chrome|SeaMonkey|Lunascape|Sleipnir|Netscape|Iceweasel)[ /][1-9][\.0-9A-Za-z]*%';
function is_browser()
{
global $BrowserList;
if(!empty($_SERVER['HTTP_USER_AGENT']) && preg_match($BrowserList, $_SERVER['HTTP_USER_AGENT'])){
return(TRUE);
}
return(FALSE);
}
// 上記のうちHTML5にある程度対応しているもの。(HTML5によるframe代用iframe+javascriptの動作を確認したもの。)
$HTML5BrowserList = '%MSIE ([8-9]|[1-9][0-9]+)|Firefox/([3-9]|[1-9][0-9]+)|Chrome/(9|[1-9][0-9]+)|Opera/(9|[1-9][0-9]+)|Safari/([5-9]|[1-9][0-9]+)|SeaMonkey/([2-9]|[1-9][0-9]+)|Lunascape[ /]([6-9]|[1-9][0-9]+)|Sleipnir/([2-9]|[1-9][0-9]+)%';
function is_HTML5_browser()
{
global $HTML5BrowserList;
if(!empty($_SERVER['HTTP_USER_AGENT']) && preg_match($HTML5BrowserList, $_SERVER['HTTP_USER_AGENT'])){
return(TRUE);
}
return(FALSE);
}
//// 携帯型モバイルブラウザの検出。
// このリストに合致した場合モバイルブラウザと判断され、フレームを使わないなど小画面での見やすさに考慮した表示がなされます。
// 但し携帯は持っていないので全く確認はしていない!!
// 移り変わりが激しいようでこまめにメンテナンスする必要があるかもしれません。
$mobile_host_list = array(
'%\.mopera\.net$%',
'%\.spmode\.ne\.jp$%',
);
$mobile_agent_list = array(
'%Mobile%',
'%ASTEL/%',
'%BlackBerry[0-9]*/%',
'%DDIPOCKET;%',
'%DoCoMo/%',
'%Google Wireless Transcoder%', // mobile agentそのものではなく接続サービスのようだが。
'%iPhone%',
'%J-PHONE/%',
'%KDDI-%',
'%Mobile Safari/%',
'%Mozzila/.*NetFront/%',
'%Nokia%',
'%SoftBank/%',
'%SonyEricsson%',
'%UP.Browser/%',
'%Vodafone/%',
'%YahooMobile/%', // Mobile Agent向けモードでサーチしているようだ。botにもいれておく。
'%Yeti-Mobile/%',
);
function is_mobile_access()
{
global $mobile_host_list, $mobile_agent_list;
$host = isset($_SERVER['REMOTE_HOST']) ? $_SERVER['REMOTE_HOST'] : '';
if($host){
foreach($mobile_host_list as $mobile_host){
if(preg_match($mobile_host, $host)){ return(TRUE); }
}
}
$agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
if($agent){
foreach($mobile_agent_list as $mobile_agent){
if(preg_match($mobile_agent, $agent)){ return(TRUE); }
}
}
return(FALSE);
}
//// 検索ロボットの判定。
// このリストに合致した場合フレームを使わないで表示されます。
// 別にこれを使わなくても通常ブラウザをかたっていない限りちゃんと表示はされますが。
// 当初 $bot_ip_listもあったが調査更新の手間が多いわりに効果がないのでやめた。(すべてhostとagentで判定できていた。)
// hostでの判定を使用するにはhttpd.confのHostnameLookupsをonにしておく必要があります。
$bot_host_list = array(
'%as13448\.com$%', // 通常を装っている検索? あやしい!
'%\.asianetcom\.net$%', // 通常を装っている検索? あやしい!
'%\.ask\.com$%',
'%bot[0-9]+\.linguee\.com$%',
'%mkt-search\.comodo\.com$%',
'%copilot\.thunderstone\.com$%',
'%\.crawl\.baidu\.jp$%',
'%\.crawl\.yahoo\.net$%',
'%crawl[-0-9]+\.naver\.jp$%',
'%crawl11\.pub\.colo-fo\.brn1\.verisign\.com$%',
'%crawl-.*\.cuill\.com$%',
'%crawl[-0-9]+.botje\.com$%',
'%crawler.*\.domaincrawler\.com$%',
'%^ec2-[-0-9]+\.compute-1\.amazonaws\.com$%',
'%\.exabot\.com$%',
'%\.googlebot\.com$%',
'%\.inktomisearch\.com$%',
'%\.irl\.cs\.tamu\.edu$%',
'%msnbot\.msn\.com$%',
'%picsearch\.com$%',
'%\.pingdom\.com$%',
'%rate-limited-proxy[-0-9]*\.google\.com$%',
'%search\.tnz\.yahoo\.co\.jp$%',
'%\.search\.live\.com$%',
'%\.search\.msn\.com$%',
'%\.sdi\.trendnet\.org$%',
'%^wtp-g.-maya[1-9]+\.sjdc%',
'%\.super-goo\.com%',
'%\.teoma\.com$%',
'%\.yahooresearchcluster\.com$%',
);
$bot_agent_list = array(
'%aiHitBot[-/]%',
'%archive.org_bot%',
'%Ask Jeeves/Teoma%',
'%Baiduspider/%',
'%Baiduspider\+%',
'%BecomeJPBot%',
'%bingbot/%',
'%BMC/%',
'%CatchBot/%',
'%Comodo-Certificates-Spider%',
'%DotBot/%',
'%DBLBot/%',
'%DomainCrawler/%',
'%\(\+Empirius bot\)%',
'%Exabot/%',
'%Ezooms/%',
'%Googlebot/%',
'%Googlebot-Mobile/%',
'%Google Web Preview%',
'%HTMLParser/%',
'%HuaweiSymantecSpider/%',
'%ia_archiver%',
'%ichiro/%',
'%ips-agent%',
'%IRLbot/%',
'%^Java/%',
'%jig browser web;%',
'%larbin[0-9\.]+%',
'%libwww-perl/%',
'%Linguee Bot%',
'%LinkWalker%',
'%Microsoft-WebDAV-MiniRedir/%',
'%MJ[0-9\.]+bot/%',
'%Mnogosearch%',
'%msnbot-media/%',
'%msnbot%',
'%NetcraftSurveyAgent/%',
'%Netcraft Web Server Survey%',
'%Nutch%i',
'%page_test larbin%',
'%PEAR-crawler%',
'%Peew/%',
'%Pingdom\.com/tools%',
'%Pingdom GIGRIB%',
'%Plukkie/%',
'%psbot/%',
'%Purebot/%',
'%Python-urllib/%',
'%ScoutJet%',
'%Search[0-9]+Bot/%',
'%Shim-Crawler%',
'%SiteBot/%',
'%Sogou Orion Spider/%',
'%Sogou-Test-Spider/%',
'%Sogou web spider%',
'%Sosospider%',
'%Speedy Spider%',
'%Steeler/%', // 東京大学喜連川研究室 http://www.tkl.iis.u-tokyo.ac.jp/~crawler/
'%SurveyBot/%',
'%\(tarakas\)%',
'%TencentTraveler%', // botではないかもしれないが挙動はそれに近い。
'%TMCrawler%',
'%TurnitinBot/%',
'%TweetmemeBot%',
'%Twiceler%',
'%webcrawler%',
'%WebDataCentreBot/%',
'%WebServerStats/%',
'%Wget/%',
'%Y!J-.*crawler%',
'%YahooCacheSystem%',
'%YahooMobile/%', // Mobile Agent向けモードでサーチしているようだ。mobileにもいれておく。
'%Yahoo! Slurp%',
'%YandexBot/%',
'%Yeti/%',
'%yetibot@naver\.com,%',
'%Yeti-Mobile/%',
'%\(Y!J-AGENT\)%',
'%YodaoBot/%',
'%^Mozilla/4\.0 \(compatible; MSIE 6\.0; Windows NT 5\.1\)$%', // trendmicro
// 以下はばかよけに近い。
'%bot%i',
'%crawler%i',
'%robot%i',
'%spider%i',
);
function is_bot_access()
{
global $bot_host_list, $bot_agent_list;
// まずIPアドレスでアクセスしてくるのはロボットとみなす。
if(preg_match('%^[1-9][0-9\.]+$%', trim($_SERVER['SERVER_NAME']))){ return(TRUE); }
// Agentが空なのも普通のアクセスとはみなせない。
if(empty($_SERVER['HTTP_USER_AGENT'])){ return(TRUE); }
$host = isset($_SERVER['REMOTE_HOST']) ? $_SERVER['REMOTE_HOST'] : '';
if($host){
foreach($bot_host_list as $bot_host){
if(preg_match($bot_host, $host)){ return(TRUE); }
}
}
$agent = $_SERVER['HTTP_USER_AGENT'];
foreach($bot_agent_list as $bot_agent){
if(preg_match($bot_agent, $agent)){ return(TRUE); }
}
return(FALSE);
}
// アクセスによる振り分け(基本形、詳細省略。)
if(is_mobile_access() || is_bot_access()){ // 携帯端末アクセス、検索アクセス
if(!empty($_REQUEST['id'])){ // ページが指定されたら
include('main.html'); // 記事ページを表示
} else {
include('sitemap.html'); // 各記事ページへのリンクを表示
}
}elseif(is_HTML5_browser()){ // ほぼHTML5に対応しているブラウザで疑似フレームの表示確認をしたもの
include('index5.html'); // HTML5でiframeを使用した左右分割疑似フレームにて表示
}elseif(is_browser()){ // 通常のブラウザでHTML5未確認
include('index4.html'); // HTML4で従来の左右分割フレーム(<frameset>)を使用して表示
}else{ // あとはわからん。フレームは使わないでおこう。
if(!empty($_REQUEST['id'])){ // ページが指定されたら
include('main.html'); // 記事ページを表示
} else {
include('sitemap.html'); // 各記事ページへのリンクを表示
}
}
?>