2009-08-09 42 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