Tag Archives: linkout

การทำ Linkout ใน SMF 1.1.x + เข้ารหัสลิ้งก์

สวัสดีครับ :) ครั้งนี้ผมมี Mod linkout เขียนเอง มาฝากผู้ใช้ SMF กันนะครับ โดยระบบ Linkout ก็เพื่อป้องกันลิ้งก์ไม่ให้ออกจากเว็บไซต์มากเกินไป

ตัวอย่างลิ้งจะเป็นแบบนี้นะครับ

http://www.yoursmf.com/link.php?ref=aHR0cDovL3d3dy50aGFpc2VvYm9hcmQuY29t

ส่วนวิธีทำนั้นไม่ยากครับ ก่อนอื่นเราต้องลบระบบลิ้งก์เก่าของ smf ออกก่อน โดยไปที่ Sources/Subs.php

หา

			array(
				'tag' => 'url',
				'type' => 'unparsed_content',
				'content' => '<a href="$1" target="_blank">$1</a>',
				'validate' => create_function('&$tag, &$data, $disabled', '
					$data = strtr($data, array(\'<br />\' => \'\'));
					if (strpos($data, \'http://\') !== 0 && strpos($data, \'https://\') !== 0)
						$data = \'http://\' . $data;
				'),
			),
			array(
				'tag' => 'url',
				'type' => 'unparsed_equals',
				'before' => '<a href="$1" target="_blank">',
				'after' => '</a>',
				'validate' => create_function('&$tag, &$data, $disabled', '
					if (strpos($data, \'http://\') !== 0 && strpos($data, \'https://\') !== 0)
						$data = \'http://\' . $data;
				'),
				'disallow_children' => array('email', 'ftp', 'url', 'iurl'),
				'disabled_after' => ' ($1)',
			),

และ

			array(
				'tag' => 'iurl',
				'type' => 'unparsed_content',
				'content' => '<a href="$1">$1</a>',
				'validate' => create_function('&$tag, &$data, $disabled', '
					$data = strtr($data, array(\'<br />\' => \'\'));
					if (strpos($data, \'http://\') !== 0 && strpos($data, \'https://\') !== 0)
						$data = \'http://\' . $data;
				'),
			),
			array(
				'tag' => 'iurl',
				'type' => 'unparsed_equals',
				'before' => '<a href="$1">',
				'after' => '</a>',
				'validate' => create_function('&$tag, &$data, $disabled', '
					if (substr($data, 0, 1) == \'#\')
						$data = \'#post_\' . substr($data, 1);
					elseif (strpos($data, \'http://\') !== 0 && strpos($data, \'https://\') !== 0)
						$data = \'http://\' . $data;
				'),
				'disallow_children' => array('email', 'ftp', 'url', 'iurl'),
				'disabled_after' => ' ($1)',
			),

ลบออกไปครับ

แล้วทีนี้ให้เราเพิ่ม function สำหรับทำ Linkout ไว้ที่ส่วนล่างสุดของไฟล์ (บน ?>)

function parseurl($url, $text) {

	if(!$url && preg_match("/((https?|ftp|gopher|news|telnet|rtsp|mms|callto|bctp|thunder|synacast){1}:\/\/|www\.)[^\[\"']+/i", trim($text), $matches)) {
		$url = $matches[0];
		$length = 65;
		if(strlen($url) > $length) {
			$text = substr($url, 0, intval($length * 0.5)).' ... '.substr($url, - intval($length * 0.3));
		}
		if(!eregi("^https?://([a-z0-9]+\.)?{$_SERVER['HTTP_HOST']}(.*)",$url)){
			$oldurl = $url;
			$url = '/link.php?ref='.base64_encode($url);
			$lout = 1;
		}
		return '<a href="'.$url.'"'.($lout ? ' class="linkout" rel="nofollow"' : '' ).' title="'.$oldurl.'" target="_blank">'.$text.'</a>';
	} else {
		$text = stripslashes($text);
		$url = substr($url, 1);
		if(substr(strtolower($url), 0, 4) == 'www.') {
			$url = 'http://'.$url;
		}
		if(!eregi("^https?://([a-z0-9]+\.)?{$_SERVER['HTTP_HOST']}(.*)",$url)){
			$oldurl = $url;
			$url = '/link.php?ref='.base64_encode($url);
			$lout = 1;
		}

		return '<a href="'.$url.'"'.($lout ? ' class="linkout" rel="nofollow"' : '' ).' title="'.$oldurl.'" target="_blank">'.$text.'</a>';
	}
}

อ๋อ อันนี้ผมดัดแปลงมาจาก Discuz นะครับ :P

แล้วให้หา

if (isset($cache_key, $cache_t) && array_sum(explode(' ', microtime())) - array_sum(explode(' ', $cache_t)) > 0.05)

แล้วเพิ่ม

$message = preg_replace("/\[url(=((https?|ftp|gopher|news|telnet|rtsp|mms|callto|bctp|ed2k|thunder|synacast){1}:\/\/|www\.|mailto:)([^\s\[\"']+?))?\](.+?)\[\/url\]/ies", "parseurl('\\1', '\\5')", $message);

ไว้ด้านบนเป็นอันจบส่วนการแก้ไขไฟล์ครับ

ทีนี้ ก็ถึงส่วนของ link.php ให้ก็อบโค้ดส่วนนี้ไปใส่แล้วนำไปวางในส่วน public_html ได้เลยครับ

<?
if(!isset($_GET['ref'])){
die();
}
$url = htmlspecialchars(base64_decode($_GET['ref']));
?>
<html xmlns="http://www.w3.org/1999/xhtml">
<meta http-equiv="Content-Language" content="th">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="robots" content="noindex, nofollow" />
<title>Linkout</title>
<style type="text/css">
body{
	font-family:Tahoma, Geneva, sans-serif;
}
a{
	color:#00F;
}
.center{
	text-align:center;
}
.text-go{
	color:#008000;
}
.text-top{
	font-size:12px;
}
</style>
<script language="javascript">
setTimeout('top.location.href="<?=$url?>"', 2500);
</script>
</head>
<body>
<div class="center">
<br />
<br />
<br />
<br />
<br />
<br />
<p><span class="text-top">ขณะนี้คุณกำลังที่จะเชื่อมต่อไปยังเว็บไซต์ภายนอก</span><br /><a href='<?=$url?>' rel="nofollow"><?=$url?></a></p>
<br />
<span class="text-go">เรากำลังพาท่านไปยังหน้าที่ต้องการ.. กรุณารอ! </span>
<br />
<br />
<br />
<span class="right">Copyright (c)
</div>
</body>
</html>

หน้านี้แต่ได้ตามสบายเลยครับ