2009-08-10 7 views
3

PHPファイルで、ユーザーをリダイレクトする必要があり、ヘッダーがすでに送信されているので、私はPHPのヘッダー機能を使用できません。この場合、ユーザーをリダイレクトする最良の方法ですか?最適なリダイレクト方式ですか?

ユーザーのブラウザブランドに関係なく、最も高速で信頼性の高い方法ですか?

echo '<script type="text/javascript">window.top.location="http://localhost/";</script>'; 

// OR 

echo '<meta http-equiv="refresh" content="0;url=' .$location. '">'; 

UPDATEここ

私はホームページにリダイレクトすることはできませんヘッダが既に送信された場合、私は、今使っている私の最終的な結果コードがあり、私はちょうどを含むのではなく、私にホームページを持って来るので、本文ページには私のホームページとフッターが含まれています

function validlogin($url) { 
    if (!isset($_SESSION['auto_id']) || ($_SESSION['auto_id']=='')) { 
     $_SESSION['sess_login_msg'] = 'Please login'; 
     $_SESSION['backurl'] = $url; 
     $temp = ''; 
     if (headers_sent() === false){ 
      header("Location: /"); 
      exit(); 
     }else{ 
      //header is already sent so we will just bring the homepage to us instead of going to it!!! 
      include 'mainbody.inc.php'; 
      include 'footer.inc.php'; 
      exit(); 
     } 
    } 
} 

答えて

4
function Redirect($url, $permanent = false) 
{ 
    if (headers_sent() === false) 
    { 
     header('Location: ' . $url, true, ($permanent === true) ? 301 : 302); 
    } 

    exit(); 
} 

Redirect('http://www.google.com/', false); 

ここでも、ob_start()を使用します。

+0

これは私の解決策の正しいトラックにあります。なぜ誰かが "出力バッファリング"を言っていない人を誰でも下降させ続けているのですが、私はそれが誰なのかをよく知っています。あなたの方法で見て、私は私の既存の機能に追加することができます、ヘッダーがすでに送信されている場合、私はちょうどそれにリダイレクトする代わりに、私のホームページを含むことができます、素晴らしいソリューション! – JasonDavis

+0

私は記録のために、私のすべての下垂体を主張します。あなたは素晴らしい方法で動作するようにメソッドを含めます。この記事の冒頭では、リダイレクトしたかったことが分かっていました。より多くの情報は常に良いです:) –

-1

私は2番目と言います。

ユーザーがJavaScriptを無効にしている場合、またはJavaScriptを使用しないブラウザを使用している場合、第1のリダイレクトは機能しません。

+0

また、PHPの出力バッファリングを参照することもできます。これにより、サーバー側のリダイレクトを使用することができます。 http://us2.php.net/manual/en/ref.outcontrol.php – easement

+0

メタリダイレクトはいつもサポートされているのでしょうか? – JasonDavis

+1

いずれにしても、彼らは両方ともバックボタンを殺す。 –

7

これらのいずれも使用しないでください。常にHTTPリダイレクトを使用する必要があります。

ob_start()を使用すると、内容をバッファし、すでに送信されたヘッダーの問題を回避できます。

何かを出力する前にリダイレクトする必要があるかどうかを知ることができるMVCアプリケーションを作成することもできます(ただし、不要な場合はob_start()が必要です)。

+0

私は同意します。アプリケーションの出力を制御し、HTTPヘッダーを使用できるはずです。絶対にできない場合は、2番目のオプションを使用してください。この答えに+1してください。 –

+0

obバッファの仕組みはよく分かりませんが、表示する前に全ページをメモリに保存しないと、トラフィックが多いサイトでパフォーマンスが悪くなる可能性がありますか? – JasonDavis

+0

いくつかのテストで小さな出力がたくさんあることがわかった場合、より大きなバッチiircより遅くなりました。グーグルやテストが必要です。 – OIS

2

バックporneLのピギー:

あなたの方法に大きな問題:あなたは戻るボタンを殺します。戻るボタンを倒すことは、ウェブ上で最も刺激的なことです。

ヘッダーが送信された後にリダイレクトする必要はありませんでした。おそらくあなたがしようとしていることを考え直すべきです。

+1

私は完全に同意します。あなたが何かを出力した後にヘッダーを送る必要があるならば、それは間違っています。 – usoban

+0

私の場合、リダイレクトするのはフォームを送信した後だけです。ユーザーがログアウトした場合、ログインページにリダイレクトされるので、戻るボタンを使用しないでください。 – JasonDavis

+0

また、ヘッダーが送信される理由は、私はすべての単一のページにあるヘッダーファイルを持っている、私はヘッダーの下に含まれているボディファイルを持っている今、いくつかのページだけで、ユーザーがログインする必要がありますので、これらのページでは、そうでないと、リダイレクトしようとするので、本体ファイルにあるので、ヘッダーは既にリダイレクトする必要があるかどうかを確認する前にロードされています – JasonDavis

関連する問題