最快的方式重定向到外部页面

时间:2012-02-03 21:57:04

标签: php redirect

我们的网站有一个游戏列表,每当有人注册时我们都会收到付款。由于我们不想显示我们的会员链接,我们有一个.htaccess mod_rewrite规则,用于像/ play / game-name这样的网址,最终会转到一个名为redirect.php的php文件,该文件从网址中提取该游戏名称并重定向(通过php标题位置)到该游戏的相应联盟链接。这可行,但似乎加载速度非常慢(根据谷歌网站管理员工具,10-20秒),它必须影响我们的转换。

有更快的方法来执行这些重定向吗?这对我来说似乎效率低下。

编辑:有关流程的更多信息。

用户访问/ play / game-name,然后.htaccess具有以下重写规则:

RewriteRule ^play/([/_0-9a-zA-Z-]+)$ redirect.php?id=$1 [QSA,L]

然后在redirect.php中我有以下内容进行重定向:

$path = array(
        'gamename1' => 'http://affiliatelink.com/?a=11111&c=222222&s1=',
        'gamename2' => 'http://affiliatelink.com/?a=11112&c=222223&s1=',
        'gamename3'  => 'http://affiliatelink.com/?a=11113&c=222224&s1=',
        );

    if (array_key_exists($_GET['id'], $path))
    header('Location: ' .$path[$_GET['id']].$s1_value);

$ s1_value是动态的,并从$ _SESSION变量将原始引荐来源提取到网站。

1 个答案:

答案 0 :(得分:2)

根据redirect.php中的逻辑构建一个静态mod_rewrite文件,并将其部署到.htaccess;然后客户甚至不会触摸php。

如果您未提前知道所有变量,您仍然可以将它们添加到.htaccess文件中,因为它们是第一次生成的,实际上这些值是动态生成的,但之后会缓存。给定路由的第一个命中很慢,PHP构建rewrite_rule并将其放在.htaccess文件中。对所述路由的后续请求不会触及PHP。你必须拿出一个清除方法来删除无效路由(如果出现这些路径)(甚至可能只为这些类型的路由专用整个.htaccess文件并定期删除整个路径)。您还需要使用此方法使用互斥锁。

这是一个样板函数,可以用互斥/错误处理逻辑包装;它还支持位置重定向作为选项。

<?php
/**
 * Generate redirect, either in the form of a Location header
 * (sent directly to STDOUT) or an rewrite rule intended to be
 * placed in a .htaccess file.
 * 
 * @param $sGameName key indicating the game name
 * @param $sReferrer string Additional value appended to result URL
 * @param $bLocationHeader boolean If true send Location header
 *
 * @return string|false If $bLocationHeader is false (default) the
                        mod_rewrite rule is returned.
 *                      Return false if the gamename isn't part of the map
 */
function gen_redirect($sGameName, $sReferrer, $bLocationHeader=false)
{
    // Establish the game name based URL map,
    // this would go in a static variable if gen_redirect was part of a class.
    static $aPaths;
    if($aPaths === null)
        $aPaths = array(
            'gamename1' => 'http://affiliatelink.com/?a=11111&c=222222&s1=',
            'gamename2' => 'http://affiliatelink.com/?a=11112&c=222223&s1=',
            'gamename3' => 'http://affiliatelink.com/?a=11113&c=222224&s1=',
        );

    // Bail if the game name is unknown (might want to do something
    // more substantial here, or as a result of this)
    if(!array_key_exists($sGameName, $aPaths))
        return false;

    $sRedirectUrl = $aPaths[$sGameName] . $sReferrer;

    // Generate the redirect in the form of a Location header
    // and send it to STDOUT
    if($bLocationHeader === true) {
        header('Location: ' . $sRedirectUrl);
        return;
    }

    // Generate the redirect as a mod_rewrite rule
    return 'RewriteRule ^play/' . $sGameName . '$ ' . 
        $sRedirectUrl . ' [QSA,L]';
}

echo gen_redirect('gamename1', 'http://moxune.com') . PHP_EOL;
echo gen_redirect('gamename2', 'http://moxune.com') . PHP_EOL;
echo gen_redirect('gamename3', 'http://moxune.com') . PHP_EOL;

测试脚本的运行:

bash-3.2$ php htaccess-redirect-builder.php
RewriteRule ^play/gamename1$ http://affiliatelink.com/?a=11111&c=222222&s1=http://moxune.com [QSA,L]
RewriteRule ^play/gamename2$ http://affiliatelink.com/?a=11112&c=222223&s1=http://moxune.com [QSA,L]
RewriteRule ^play/gamename3$ http://affiliatelink.com/?a=11113&c=222224&s1=http://moxune.com [QSA,L]

看起来你需要再接受一个入站参数来表示来自客户端的引用来实现它,基本上你的通用规则是:

  

/ play / [game-name] / [referrer-name] - &gt;   ?http://affiliatelink.com/ [字段-从-URL映射]安培; S1 = [引荐名称]

另外,如果您使用的是Linux,我可以使用sem_get & friends作为互斥锁实现的粉丝;)