2017-12-01 6 views
0

目的:ユーザーの出発地がロンドンの場合は、ユーザーを特定のリンク先ページ/パスにリダイレクトします。Drupal 7.xでPHPリダイレクトを正しく実装する方法は?

問題:以下のリダイレクト方法を実施 戻り、次の失敗の結果:

何も起こらない>>ヘッダ( "http://mywebsite/subcat")。

  1. リダイレクトが多すぎます>> header( "Location:http://mywebsite/subcat");
  2. リダイレクトが多すぎます>> header( "Location:/ path");
  3. リダイレクトが多すぎます>> drupal_goto( "http://mywebsite/subcat");
  4. リダイレクトが多すぎます>> drupal_goto( "/ path");
  5. エンドレスループ>> JS: window.location.replace( "http://example.com/path");

IMPLEMENTATION: 私は、スタンドアロンのPHPで使用された場合正常に動作し、いくつかの異なったSOの記事(とすぐに私は私が探したポスト覚えて信用を与えるだろう)(から以下のスクリプトをハッキングheader.tpl.phpの上にある最初のブロック(または私のカスタムモジュール[hook_initを使って)]の中に最初のブロックとして配置されている場合、同じ結果が問題に表示されます。 USED​​

FUNCTION:私のコードで

 <?php 

    function get_client_ip() 
    { 
     if (!isset ($_SERVER['REMOTE_ADDR'])) { 
      return NULL; 
     } 

     $proxy_header = "HTTP_X_FORWARDED_FOR"; 
      if (array_key_exists ($proxy_header, $_SERVER)) { 
       $client_ip = trim (end (explode (",", $_SERVER[$proxy_header]))); 
       if (filter_var ($client_ip, FILTER_VALIDATE_IP)) { 
        return $client_ip; 
       } else { 
        // Validation 
       } 
      } 
     return $_SERVER['REMOTE_ADDR']; 
    } 

    $ip = get_client_ip(); // the IP address to query 
    $query = @unserialize(file_get_contents('http://ip-api.com/php/'.$ip)); 
    if($query && $query['status'] == 'success') { 

if ($query['country'] == "United Kingdom"){ 
     header("Location: /mypath"); 
     } else { 
      echo 'Unable to get location'; 
     } 
    } 
    ?> 

の仮定

  • 論理エラー。
  • リダイレクト方法/ロジックの不適切な使用
  • 他のモジュールの実行 によって上書きされるコードの不適切な配置。
+0

あなたが求める答えとは無関係ですが、ロケーションヘッダーを発行した後で常に「exit」または「die」を呼び出す必要があります。ヘッダーが発行された後にコードが実行され、望ましくない副作用を引き起こす可能性があります。 – Scoots

+0

@Scootsの注釈ありがとうございましたが、残念ながらそれは修正されませんでした。 – brooklynsweb

+0

さて、私はそれが答えではないと言った、それはあなたが従うべき一般的なルールです。彼が「ログインしていなければ管理者からリダイレクトする」の後に、「終了」と呼んでいない人について、私が読んだところ、かなり素晴らしい話があった。長い話を簡単に言えば、Googleのbotはすべての「ページを削除」リンクをクリックした。 – Scoots

答えて

0

THE AHA!モーメント:

私は完全にコード処理の一般的な旅を無視した機能に集中していました。私のコードが失敗していた問題は、「ページ」やコンテンツが本当に何であるかに関してCMSを扱っていることです。コンテンツは動的であり、その場で生成されます。だから私の論理テストが満たされていれば、リダイレクトは同じ論理テストで動的に生成された別のコンテンツにつながります。こうして私は無限ループを作りました。

ソリューションは、私が原点をチェックするだけでなく、ノードのIDを確認するために私のコードを変更しました。つまり、正しいテストロジックは次のとおりです。

原点がロンドンで、ロードされたノードが英国の着陸ノードでない場合は、英国の着陸ノートにリダイレクトします。

あなたはあなたが学び続ける!

関連する問題