2012-02-03 12 views
2

私たちのサイトにはゲームのリストがあり、誰かがサインアップするたびに払います。アフィリエイトリンクを表示したくないので、/ play/game-nameのようなurlの.htaccess mod_rewriteルールは、URLからそのゲーム名を引き出すredirect.phpというPHPファイルに行きますそのゲームの対応するアフィリエイトリンクに(PHPヘッダの場所を介して)リダイレクトします。これはうまくいきますが、Google Webマスターツールによれば、実際には非常にゆっくり読み込まれているようです(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

あなたは私たちがより良いフィードバックを提供することができ、サンプルのURLを提供する場合のmod_rewriteが、これを行うことができるかもしれませんそれ以外の場合は、RewriteCond http://www.rankinglabs.com/Mod_Rewriteを読むことを検討してください。 – Devraj

答えて

2

redirect.phpのロジックに基づいて静的なmod_rewriteファイルをビルドし、それを.htaccessにデプロイします。クライアントはPHPにも触れません。

事前にすべての変数がわからない場合は、最初に生成されたときに.htaccessファイルに追加することができます。本質的に値はオンザフライで生成されますが、その後キャッシュされます。与えられたルートの最初のヒットは遅く、PHPはrewrite_ruleをビルドし、.htaccessファイルに配置します。その後の上記のリクエストはPHPには触れません。無効なルートを削除するためのパージ方法を用意する必要があります(これらのルートタイプの.htaccessファイル全体を定期的に削除することもできます)。また、このアプローチでは、ミューテックスを採用する必要があります。

ここでは、ミューテックス/エラー処理ロジックをラップすることができるボイラープレート機能があります。 Locationリダイレクトをオプションとしてサポートしています。

<?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; 

テストスクリプトの実行:あなたは、一般的な、本質的に、しかしそれをやってのけるために、クライアントからのリファラを表すために、1つの以上のインバウンドのパラメータを受け入れる必要がありますように見えます

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ファイルを使用するよりもはるかに高速です - AllowOverrideを無効にすると、ファイルシステムの 'stat'呼び出しが回避されます – Cal

+0

私はしかし、あなたはhttpd.confを禁止するかもしれないようにウェブサーバをバウンスして新しいルートを展開しなければならないが、何かを考慮する必要がある。 – quickshiftin

+0

数ミリ秒の違いはおそらくありません;ここでも問題ありません – Cal

関連する問題