2014-09-24 22 views
0

我讀過一些使用META刷新重定向的地方,這不是一個推薦的做法。有沒有很好的做法用PHP重定向,允許顯示<BODY>內容?

據我瞭解header("refresh:0;url=$url");在PHP中, 和<meta http-equiv="refresh" content="0;url=$url/" />在HTML META標記, 都被認爲是一個META刷新這將返回這個頭:

HTTP/1.x 200 OK 
... 
Refresh: 0;url=$url 

假設我不想使用JS重定向,是否可以使用其他建議的練習重定向,例如301或302,同時仍在重定向頁面中運行以下元素,例如以下消息和某個腳本?

<?php 
$url = "could-not-get-a-foo-parameter-at-all-error-monitoring-page.html"; 

if(isset($_POST['foo'])){ 

    switch ($_POST['foo']) { 

    case "a": 
     $url = "http://www.aaa.com/"; 
     break; 

    case "b": 
     $url = "http://www.bbb.com/"; 
     break; 

    default: 
     $url = "foo-parameter-exists-but-is-wrong-error-monitoring-page.html"; 
     break; 
    } 
} 

header("refresh:0;url=$url"); 

?> 
<!doctype html> 
<html> 
<head> 

<style> 
.message { 
    color:blue; 
} 
</style> 
</head> 
<body> 
<div class="message">Redirecting, Please hold on...</div> 
<script> 
something 
</script> 
+2

不,沒有理由在發出HTTP 3xx重定向時顯示正文內容,因爲用戶代理(瀏覽器)會立即請求下一個資源(由Location:標題給出)。 – Dai 2014-09-24 20:46:14

+0

嘿@rockyraw!很高興再次發佈幾乎相同的問題。 – 2014-09-24 20:56:50

+0

@JayBlanchard我懇求不同,它是一個類似的代碼,但不是真正相同的問題 – rockyraw 2014-09-24 21:08:39

回答

1

您不能調用PHP一旦頁面呈現(沒有更多的PHP到另一臺服務器的請求),因此任何形式的延遲重定向是不可能這樣的。你用JS或者meta header刷新(顯然,你不能在純HTML中使用PHP變量,如果你真的想在重定向之前把頁面保留一段時間,你需要超過0秒)。

+0

哦,一個downvote,迫不及待地想聽到... – Shomz 2014-09-24 20:47:53

+0

你的答案顯然是錯誤的。 – TML 2014-09-24 20:48:48

+0

@TML告訴我更多,你可以在完成渲染你正在查看的頁面後調用PHP。 – Shomz 2014-09-24 20:49:16

-2

使用的其他東西比0刷新值: header("refresh:10;url=$url");

+0

告訴OP爲什麼刷新值必須不同。 – 2014-09-24 20:53:50

+0

因爲這不是問題的真正主題(這是關於推薦的替代重定向方法)的答案,我想這是一個評論?你能解釋爲什麼不是0嗎? – rockyraw 2014-09-24 21:05:23

+0

如果你想要「顯示身體並運行一些javascript」,給零時間以外的東西時間就可以做到這一點。 '0'是UA在刷新URL之前等待的秒數。 – TML 2014-09-24 21:07:56

1

簡短的回答。編號

一個PHP頭重定向,<?php header('location: [url]');?>將給你302頭,瀏覽器將重定向到,但你不能發送HTML,這將永遠不會被用戶看到,因爲只要瀏覽器看到該頭,它會立即重定向,並不會顯示其餘的內容。 您可以根據TML建議更改元重定向的超時時間,但這會在定時間隔結束前離開頁面,或者您可以使用您的消息創建插頁式頁面,並讓他們知道重定向發生的時間,可以選擇立即點擊「這裏」立即重定向。

+0

我相信OP希望這個頁面有一段時間了。 – Shomz 2014-09-24 20:56:46

+0

@Shomz我不希望重定向頁面有一段時間,只有一秒左右,足以顯示「重定向你」的消息並執行跟蹤JS腳本 – rockyraw 2014-09-24 21:07:17

+0

什麼是插頁式頁面?這不正是我在這裏做的事情嗎? – rockyraw 2014-09-24 21:11:58

0

使用所有3個選項,因爲它會優雅地降級。

  1. 元刷新。 (與JS一起工作)
  2. JS位置重定向。 (允許更多的控制比元刷新,活潑)
  3. 靜態HTML錨點。 (對於那些想要內容比刷新更快的用戶的備份)

不確定是否仍然存在問題,但某些瀏覽器不會爲0秒元刷新發送referer頭,而是需要一點時間來設置它。

+0

1)事情是,我不情願(出於我自己的原因)在頁面的源代碼中的任何地方都有url,這意味着我唯一的選擇可能是隻在標頭中發送URL。 2)你的意思是說,爲了安全措施,我應該至少使用'1'秒作爲間隔? 3.通過更多的控制和敏捷,你的意思是什麼? – rockyraw 2014-09-24 23:00:09

+0

1)沒有URL,瀏覽器無法知道去哪裏。無論使用何種方法,URL都會暴露給客戶端。 2)這是一個老bug,1秒鐘是修復,不確定當前狀態,但可以放置一些時間。 3)JS給你一個機會來處理客戶端上的URL,當你決定做重定向時立即響應,給你更多的功能而不是元刷新,但是當JS被禁用時,元刷新工作。 – MrYellow 2014-09-24 23:02:44

+0

1)瀏覽器會知道是否通過發送的標題獲取信息,而不是從頁面的源獲取信息。我的意思是這就是我目前的代碼所做的。 2)所以你說'0秒的JS重定向會比0秒的元刷新更快?這對我的訪客有多重要?並且出於好奇,因爲只有一個重定向可以發生,您建議將哪一個作爲後備(JS/META),並且應該在什麼時間設置? – rockyraw 2014-09-24 23:08:11