「[PHP] 404レポート(PHP版)Ver.0.05→0.08」(「[PHP] 404レポート(PHP版)」)に「CakePHP with CloudFlare」の内容を追加してバージョンアップした。
バージョンアップと言ってもただそれを追加しただけではあるが、未だに動いてたりするので・・。
スポンサードリンク
ソースコード
上図の場所にCloudFlare対応箇所を追記しただけ。
<?php /* =================================================== * 404 Report and Suggest for mb-PHP * --------------------------------------------------- * DESCRIPTION: * - output 404 message for user * To display a polite message to visitors * * - guide for new site by searched strings * The destination guides to parse the search term. * * - site administrator get error mail * To send a message to the site administrator. * * USGE: * write .htaccess file * ErrorDocument 404 /err404.php * * !CAUTION! * Add your .htaccess file, protected conf file. * * <Files ~ "\.conf$"> * deny from all * </Files> * * LICENSE : GNU GPL * CODE : UTF-8 * LANGUAGE: PHP, ja-JP * * AUTHER : * COPYRIGHT (C) CASEY 2011-2013 * https://pc.casey.jp/ * * VERSION : * ver.0.01 2011.09.18 first version * ver.0.02 2011.09.19 change algorithm * ver.0.03 2011.09.19 add reject function * ver.0.04 2011.09.19 change reject algorithm * ver.0.05 2011.09.29 add need referer * ver.0.06 2011.10.02 use conf file. * ver.0.07 2011.10.02 add host name to mail body. * ver.0.08 2011.10.02 add host name to subject. * ver.0.09 2013.04.30 add CloudFlare ENV. * =================================================== */ /* ---------------------------------- * read config file * ---------------------------------- */ require_once(dirname(__FILE__) . '/err404.conf'); /* ---------------------------------- * define [do not change!] * ---------------------------------- */ // program version $VER = "0.09"; // get start time $sTime = time(); // 2013.04.30 add, check CloudFlare if ( isset( $_SERVER[ 'HTTP_CF_CONNECTING_IP' ] ) ) { $_SERVER[ 'REMOTE_ADDR' ] = $_SERVER['HTTP_CF_CONNECTING_IP']; } // program name $host_name = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : php_uname("n"); $program_name = "404 error report Ver."; $program_name .= $VER . " on " . $host_name; // add host name into mail subject $mail_subject .= " (" . $host_name . ")"; // dev $debug = false; // =================================================== // MAIN // =================================================== // 2011.09.19 ver.0.27 // init if($debug){ _setDebugvalue(); } // start output outputHeader(); echo getHeaderHtml(); // add ver.0.05 if(!isset($_SERVER["HTTP_REFERER"])){ if($need_referer){ $mail = false; } }else{ $keywords = getKeywords(); // return suggest if($keywords && $new_url_suggest){ getSuggest(); } } // mail send $mail_body = getMailbody(); if(!$debug && $mail){ echo "<p>この問題は管理者に通知されました。</p>"; mailSend(); } // debug info if($debug){ _debuginfo(); print_r($rejects); } // print footer echo getFooterHtml(); // end of script exit(); // =================================================== // FUNCTIONS // =================================================== // ==================================== // output footer html // ==================================== // 2011.09.19 ver.0.03 function getFooterHtml(){ $host = $_SERVER['HTTP_HOST']; return <<< EOH <div align="right"> <a id="site-link" href="http://$host" target="_blank">$host</a> </div> </body> </html> EOH; } // ==================================== // output header html // ==================================== // 2011.09.19 ver.0.03 function getHeaderHtml(){ return <<< EOH <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>404 Not Found</title> <link rel="stylesheet" href="/err.css" type="text/css" /> </head> <body id="error-page"> <h1>404 Not Found</h1> <h2>ページが見つかりません</h2> <p>リクエストされたページが見つかりませんでした。</p> EOH; } // ==================================== // mail send // ==================================== // 2011.09.19 ver.0.03 function mailSend(){ // init global $mail_addr_to, $mail_subject, $mail_body, $mail_addr_from; // set japanese mb_language("japanese"); mb_internal_encoding("UTF-8"); // mail send mb_send_mail( $mail_addr_to, $mail_subject, $mail_body, "From:" . $mail_addr_from ); } // ==================================== // debug information // ==================================== // 2011.09.19 ver.0.03 function _debuginfo(){ // init global $mail_body; echo "[ DEBUG MODE ]<br />\n"; $debug_html = $mail_body; echo preg_replace('/\n/', '<br />', $debug_html); } // ==================================== // suggest links // ==================================== // 2011.09.19 ver.0.03 function getSuggest(){ // init global $keywords, $new_url_base, $new_url_querystr; // from search engine echo "<p>もしかしたら以下に移動したかもしれません:</p>"; echo "<ul>"; $new_url = $new_url_base . $new_url_querystr; foreach($keywords as $word){ echo '<li><a href="' . $new_url . urlencode($word) .'" target="_blank">移転先(' . $new_url_base . ')を「' . $word . "」で再検索する</a></li>"; } echo "</ul>"; } // ==================================== // set debug mode value // ==================================== // 2011.09.19 ver.0.03 function _setDebugvalue(){ // add ver.0.05 global $need_referer, $mail; if(!isset($_SERVER["HTTP_REFERER"])){ $_SERVER["HTTP_REFERER"] = ''; } } // ==================================== // make mail body // ==================================== // 2011.09.19 ver.0.05 function getMailbody(){ // init global $keywords, $rejects, $program_name, $sTime, $mail; $mail_body = "ErrorID: " . $_SERVER["REQUEST_TIME"] . "\n"; //$mail_body .= "HTTP_HOST: " . $_SERVER["HTTP_HOST"] . "\n"; //$mail_body .= "REQUEST_URI: " . $_SERVER["REQUEST_URI"] . "\n"; $mail_body .= "URL: http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] . " \n"; if($keywords){ if(is_array($keywords)){ $mail_body .= "QUERY:" . implode(",", $keywords) . "\n"; }else{ $mail_body .= "QUERY:" . $keywords . "\n"; } }else{ $mail_body .= "QUERY: Unknown" . "\n"; } $mail_body .= "HTTP_REFERER: " . $_SERVER["HTTP_REFERER"]. "\n"; $mail_body .= "REMOTE_ADDR: " . gethostbyaddr($_SERVER['REMOTE_ADDR']) . " (".$_SERVER['REMOTE_ADDR'].")" . "\n"; $mail_body .= "REQUEST_TIME: " . date('Y/m/d H:i:s', $_SERVER['REQUEST_TIME']) . "\n"; $mail_body .= "\n" . $program_name . " (C) https://pc.casey.jp 2011-2013 "; $eTime = time() - $sTime; $mail_body .= " (" . $eTime . "Sec+)"; // 2011.09.19 add reject // 2011.09.19 remove // favicon.ico //$pos = strpos($_SERVER["REQUEST_URI"], 'favicon.ico'); //if($pos !== false){ $mail = false; } // 2011.09.19 add reject new if(in_array($_SERVER["REQUEST_URI"], $rejects)){ $mail = false; }; return $mail_body; } // ==================================== // start output // ==================================== // 2011.09.19 ver.0.02 function outputHeader(){ // init global $debug; if($debug){ header( 'HTTP/1.1 200 OK' ); }else{ header( 'HTTP/1.1 404 Not Found' ); } header( 'Expires: Wed, 11 Jan 1984 05:00:00 GMT' ); header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' ); header( 'Cache-Control: no-cache, must-revalidate, max-age=0' ); header( 'Pragma: no-cache' ); header( 'Content-Type: text/html; charset=utf-8' ); } // ==================================== // check referer // ==================================== // 2011.09.19 ver.0.07 function getKeywords(){ // init global $new_url_extract; $keywords = null; // check ref if(isset($_SERVER["HTTP_REFERER"])){ // decode referer $_SERVER["HTTP_REFERER"] = urldecode($_SERVER["HTTP_REFERER"]); // check domain $U = @parse_url($_SERVER["HTTP_REFERER"]); // check search strings $pos = strpos($U["host"], 'google'); if($pos !== false){ //Google # q= preg_match('/q\=([^\&]+)/', $_SERVER["HTTP_REFERER"], $Qstr); }else{ //Yahoo ? p= preg_match('/p\=([^\&]+)/', $U["query"], $Qstr); } // split keywords by space to keyword array if($Qstr[1]){ // keywords extract if($new_url_extract){ $keywords = preg_split('/[\s ]+/', $Qstr[1]); }else{ $keywords[] = $Qstr[1]; } } } return $keywords; }
動作確認
もはやどのように動作するかも忘れてしまっている部分があって、意図的に発生させた404ではエラーがレポートされなかった。
そういえばエラー報告抑制のためのロジックがあったようなかなったような。
ひとまずデバッグモードにして値を確認したところ、正しい内容を表示しているので、よいと思う。たぶん。
コメント