簡體   English   中英

PHP中的標頭會覆蓋HTTP響應代碼

[英]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

  • HTTP / 1.1 308永久重定向
  • 主持人:localhost:8000
  • 地點:hello.php
  • 連接:關閉
  • X-Powered-By:PHP / 5.5.6

Actual result

  • 302 Found HTTP / 1.1 302 Found
  • 主持人:localhost:8000
  • 地點:hello.php
  • 連接:關閉
  • X-Powered-By:PHP / 5.5.6

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM