2011-03-13 95 views
1

我正在開發一個自定義內容管理腳本,並且正在進行頁面重定向。設置變量並使用標題()

下面的代碼將URL代碼與數據庫中某個頁面ID的URL進行比較,如果兩個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

使用此:

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

如果$ RAWDATA [ 'htmltitle']是你的頁面的完整URL,這樣使用:

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

,並且還加入die()header()後是良好的。

+0

不,不起作用。它也被稱爲htmltitle。 – bear 2011-03-13 23:26:51

+0

哦,是什麼錯誤。看看我的更新。 – Kemal 2011-03-13 23:38:06

-1

一旦發送位置標題,瀏覽器將中止當前操作並在重定向位置獲取頁面。這意味着對於所有的意圖和目的,一個位置('header:example.com')與die()具有基本相同的效果。您可以使用輸出緩衝來覆蓋此行爲,也可以將頭()調用移到腳本中。但是,您不能將它們移動到print_redirect_unexpected調用之後,因爲向瀏覽器發送任何輸出都會導致所有標題都被髮送,並且您將無法再發送。

所以基本上,你需要打開輸出緩衝。

+0

-1:'header('Location:')'不殺死活動腳本。但它確實阻止您看到腳本的輸出。試圖阻止未經授權的用戶製作不需要的「DELETE」時,這是一個重要的細微差別。 – 2011-03-13 22:57:59

+0

我確實說過「基本上」。雖然這是真的腳本繼續運行,你永遠不會看到它的輸出,所以效果幾乎是一樣die(),除非你的腳本導致文件系統/數據庫的變化。 – GordonM 2011-03-13 23:01:01

+0

這是一個非常重要的除非。 – 2011-03-13 23:32:57

1

當您發送Location:標頭時,用戶代理將停止加載當前頁面並加載您告訴它加載的任何頁面,以便您永遠不會看到輸出。

但是,你的代碼可能*繼續在後臺執行,所以平時要跟隨你header()exit;,以防止不必要的行爲。

*取決於服務器配置和ignore_user_abort

另外,header("Location: /{$rawdata['htmltitle']}");就足夠了。由於您重定向到同一臺服務器,因此絕對路徑就足夠了。不要使用$_SERVER變量過度複製您的重定向。

+0

那麼我會如何處理這種情況呢? – bear 2011-03-13 23:27:18

+0

@Shamil:在重定向URL中使用GET變量傳遞狀態信息或使用'$ _SESSION'變量。 – 2011-03-13 23:34:40

+0

我試着添加一個GET,但是,重定向失敗。 – bear 2011-03-13 23:35:40