
「[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ではエラーがレポートされなかった。
そういえばエラー報告抑制のためのロジックがあったようなかなったような。
ひとまずデバッグモードにして値を確認したところ、正しい内容を表示しているので、よいと思う。たぶん。


コメント