[英]Header in PHP overrides the HTTP Response code
解決Apache級別的設置規則,發現php中的標題('Location:filename.php')會覆蓋響應代碼。 看下面的代碼: -
<?php
header('HTTP/1.1 308 Permanent Redirect'); //or Try for 4xx/5xx Code
header('Location: http://hello.php');
?>
Expected result
Actual result
302 Found
HTTP / 1.1 302 Found
Apache級別的錯誤或PHP中的錯誤?
更新:
根據功能文檔頁面,這是PHP發送Location標頭時所需的行為。
編輯:對不起,誤讀了你的消息。 如果您發送的代碼不同於3xx,它將覆蓋響應代碼,因此它應該與308一起使用。您確定沒有其他HTTP代碼被發回嗎? 您的客戶端是否嘗試檢索新資源,您是否將302視為最終結果?
最終編輯:你試過嗎?
header('Location: /some/page.php', TRUE, 308);
正如header()的PHP文檔中所提到的,標題的“Location”類型有一個特例。 除非已設置201或3xx狀態代碼,否則它將設置302響應代碼。 不幸的是,它不起作用,你可以在你的例子中看到。
我玩過代碼,當你改變這樣的操作順序時它看起來很有用:
<?php
header('Location: landing.php');
header('HTTP/1.1 308 Permanent Redirect');
?>
似乎是標題('Location ...在任何情況下覆蓋響應代碼但是在執行標題('HTTP / 1.1 308 ...之后將其更改回308)。
做了一些額外的調查,這是結果。
header('Location: http://smth');
除了308之外,不會更改3 **的響應代碼。所以如果你這樣做了
<?php
header('HTTP/1.1 307 Temporary Redirect');
header('Location: landing.php');
?>
上面的代碼將按預期正常工作。 所以你很幸運能在規則中找到例外。 雖然我的解決方法允許解決問題。 PS:使用PHP 5.4.27
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.