2009-08-09 44 views
4

你在哪裏使用命令header()?要了解PHP的標頭()

我在處理程序/ handle_login.php有以下代碼。用戶從index.php這個出發地點去了網站。

if(!$logged_in){ 
    header("Location: index.php");                   
    die("You are not logged_in"); 
} 

如果if子句是真的,我得到一個404錯誤,因爲頭使我對handlers/index.php,而不是index.php

+0

您的代碼在header()調用之前是否做出任何其他輸出?如果是這樣,請描述它。 – fixmycode 2009-08-09 02:18:10

+0

謝謝你的回答! – 2009-08-09 02:59:12

+0

從我的測試中,PHP在發送到客戶端之前似乎沒有改變「Location」頭的值。瀏覽器要麼將當前上下文解釋爲'handlers /',要麼你的環境有一些非常棒的'Location'頭部翻譯,因爲我厭倦了設計動態創建絕對URI的方法。 – Zenexer 2013-06-01 06:43:52

回答

8

雖然我nilamo和伯爵同意,我希望我可以給一個更大的圖景:

使用相對路徑可以有很奇怪的效果取決於在瀏覽器 「認爲」它位於您的網站層次結構中。例如,假設該站點有一個索引文件'/index.php',但被配置爲接受URI路徑中的模塊和動作。你很可能有一個網址,看起來像:

http://www.yoursite.com/forms/contact/ 

從這種情況下,返回一個頭,如:

header("Location: index.php"); 

很可能導致瀏覽器嘗試請求

http://www.yoursite.com/forms/contact/index.php 

這顯然不是你想要的。出於這個原因,通常最好使用上面推薦的'/index.php',或者在可能的情況下更好地使用完全限定的URL。

希望這會有所幫助。

+8

我只會補充一點,HTTP/1.1 RFC明確指出,標題位置中給出的URL必須是絕對的,而不是相對的:「字段值由單個絕對URI組成」(請參見http://www.w3。 org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30);即使瀏覽器一般都會使用相對URL來處理,您應該使用絕對URL – 2009-08-09 12:31:32

1

嘗試使用「/」:

if(!$logged_in){ 
    header("Location: /index.php");                   
    die("You are not logged_in"); 
} 

沒有斜線,假設你指的是在當前目錄下的東西。通過在前面粘貼該斜線,您明確指出網站根目錄中的文件。由於頁面是'index.php',您可以輕鬆使用「header('Location:/')」。

+1

Downvoted,因爲HTTP規範說位置標頭必須是絕對URL。如果你使用親屬,它可能會或可能不會工作。 – 2011-11-03 19:34:44

4

將位置設置爲index.php的完整URL,而不僅僅是文件名。根據php.net,這是正確的做法,不要使用相對路徑。這裏有一個例子:

if(!$logged_in){ 
    header("Location: http://exampledomain.com/index.php"); 
    die("You are not logged_in"); 
} 
+0

我正在脫機調試我的代碼,因此我無法使用此類網址。但是,我不確定像「http:// localhost/index.php」這樣的url是否與您的url類似。 – 2009-08-09 02:40:15

+0

您可以嘗試使用$ _SERVER ['SERVER_NAME']全局變量。 – Phoexo 2009-08-09 03:28:38