2011-03-13 8 views
1

私はカスタムコンテンツ管理スクリプトを開発しています。私はページリダイレクトに取り組んでいます。変数を設定してheader()を使用する

以下のコードは、URLコードとデータベース内の特定のページIDのURLを比較し、2つのURLが同じでない場合、ユーザーはリダイレクトされます。

しかし、私はページがリダイレクトされているかどうかを確認できるように変数を追加したいと思います。それは動作していません。

if (isset ($_GET ['id']) && $rawdata) { 
     if ($_SERVER ["REQUEST_URI"] != $rawdata ['htmltitle']) { 
      header ("HTTP/1.1 301 Moved Permanently"); 
      header ("Location: http://${_SERVER['SERVER_NAME']}:${_SERVER["SERVER_PORT"]}${rawdata['htmltitle']}"); 
      $redirected = true; 
      ; 
     } 
    } 

if ($redirected == true) { 
      print_redirect_nonexpected(); 
     } 

function print_redirect_nonexpected(){ 
echo "<!-- REDIRECTED _ NOT _ EXPECTED ? -->"; 
} 

機能は実行されていないため、エコーは発生しません。 ここで間違っていることは何ですか?

答えて

1

使用この:$生データ[ 'htmltitleは']あなたのページの完全なURLがある場合

header ("Location: http://".$_SERVER['SERVER_NAME'].$_SERVER['SERVER_PORT'].$rawdata['htmltitle']); 

は、これを使用する:die()を追加することも

header ("Location: http://".$rawdata['htmltitle']); 

そしてheader()後は良好です。

+0

いいえ、動作しません。これはhtmltitleとも呼ばれます。 – bear

+0

ああ、これは間違いだ。私の更新を見てください。 – Kemal

-1

Locationヘッダーが送信されると、ブラウザは現在の操作を中断し、リダイレクトされた場所にページを取得します。つまり、すべてのインテントと目的で、場所( 'header:example.com')は本質的にdie()と同じ効果を持ちます。出力バッファリングを使用してこの動作を無効にするか、header()呼び出しをスクリプト内で下に移動することができます。ただし、print_redirect_unexpected呼び出しの後にそれらを移動することはできません。ブラウザに出力を送信すると、すべてのヘッダーも送信され、それ以上送信できなくなります。

基本的に、出力バッファリングをオンにする必要があります。

+0

-1: 'header( 'Location:')'はアクティブなスクリプトを強制終了しません。ただし、スクリプトの出力を見ることはできません。許可されていないユーザーが不要な「DELETE」を作成しないようにしようとするとき、重要なニュアンスです。 –

+0

「本質的に」と言いました。スクリプトが実行されている間は出力は表示されませんので、スクリプトがファイルシステム/データベースの変更を引き起こしている場合を除き、効果はdie()とほとんど同じです。 – GordonM

+0

それは非常に重要です。 –

1

Location:ヘッダーを送信すると、ユーザーエージェントは現在のページの読み込みを停止し、読み込むページを読み込みます。その結果、出力は表示されません。

しかし、あなたのコードは*は、バックグラウンドで実行し続けることができ、これは通常、あなたは、不要な動作を防ぐためにあなたのheader()exit;でフォローしたいです。

*サーバーの構成とignore_user_abortによって異なります。また、header("Location: /{$rawdata['htmltitle']}");でもよい。同じサーバーにリダイレクトするので、絶対パスで十分です。 $_SERVER変数を使用してリダイレクトを何も作成しないでください。

+0

だから私はこの状況にどのように対処しますか? – bear

+0

@Shamil:リダイレクトURL内のGET変数で状態情報を渡すか、 '$ _SESSION'変数を使用します。 –

+0

私はGETを追加しようとしましたが、リダイレクトは失敗しています。 – bear