2012-02-03 13 views
2

Наш сайт имеет список игр, и мы получаем деньги каждый раз, когда кто-то подписывает их. Поскольку мы не хотим показывать нашу партнерскую ссылку, у нас есть правило .htaccess mod_rewrite для URL-адреса, такого как/play/game-name, который заканчивается выходом в php-файл с именем redirect.php, который вытаскивает это имя игры из URL-адреса и перенаправляет (через расположение заголовка php) на соответствующую партнерскую ссылку для этой игры. Это работает, но, похоже, он загружается очень медленно (согласно Google Webmasters Tools, где-то от 10 до 20 секунд), и это должно влиять на наши конверсии.Самый быстрый способ перенаправления на внешнюю страницу

Есть ли более быстрый способ сделать эти переадресации? Мне это кажется неэффективным.

Редактировать: дополнительная информация о процессе.

Пользователи посещают/гейм-имя/воспроизведения, то .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

mod_rewrite может быть в состоянии сделать это, если вы предоставите нам примеры URL-адреса мы можем обеспечить лучшую обратную связь, в противном случае подумайте о том, чтобы прочитать о RewriteCond http://www.rankinglabs.com/Mod_Rewrite – Devraj

ответ

2

Создайте статический файл mod_rewrite на основе логики в redirect.php и разверните его в .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] 

Похоже, вам нужно принять еще один входящий параметр для представления реферер от клиентов, чтобы вытащить его, хотя, по существу, ваши общий правило будет:

/[игра-имя]/воспроизведение/[реферер-имя] -> http://affiliatelink.com/?[fields-from-url-map] & s1 = [реферер -name]

Кроме того, если вы на Linux, я фанат sem_get & friends для реализации мьютекса;)

+1

, помещая его в httpd.conf значительно быстрее, чем использование файла .htccess - избегает вызовов 'stat' файловой системы, если вы отключите AllowOverride – Cal

+0

Я думал об этом , но вам нужно отскакивать веб-сервер для развертывания новых маршрутов, чтобы запретить HTTPd.conf, но что-то учитывать. – quickshiftin

+0

Разница в несколько миллисекунд, вероятно, не имеет значения здесь – Cal

Смежные вопросы