2012-10-11 72 views
1

由于header("Location: ");标头需要使用绝对路径而不是相对路径,因此我使用$_SERVER变量组成了一个绝对路径。PHP位置标头绝对路径

function getAbsolutePath($relativePath = "/site/123/") { 
if (isset($_SERVER['HTTPS'])) { 
    $protocol = 'https'; 
} else { 
    $protocol = 'http'; 
} 

$host = $_SERVER['HTTP_HOST']; 

$port = $_SERVER['SERVER_PORT']; 

$absolutePath = 'Location: ' . $protocol . "://" . $host . ":" . $port . $relativepath; 
return $absolutePath; 
} 

这是一个完美的方法,这样做,或者是他们的任何更好的选择吗?

+1

“”/ site/123 /“'不是相对路径。它将从根目录开始。 – Leri

+1

@PLB我认为OP确实意味着完整的主机+协议,而不仅仅是相对路径。规范要求技术上完全支持主机,尽管这里有很少人倾向于使用它。 http://en.wikipedia.org/wiki/HTTP_location –

+1

从HTTP 1.1中,_absolute URI总是以一个方案名和一个冒号开头._ –

回答

1

这是制定绝对URI的“教科书”方式。

我想强调一些注意事项。

  1. $_SERVER['HTTPS']可能并不总是被定义;在这种情况下应该检查$_SERVER['SERVER_PORT'] == 443的条件;如果您位于通过HTTP转发流量的HTTPS负载平衡器之后,并且上述方法均不起作用,则您可能必须对其进行硬编码。

  2. $_SERVER['HTTP_HOST']并不总是被定义;这种情况很少发生,HTTP/0.9没有定义它,一些自制的HTTP脚本可能不会通过它。你可以看看$_SERVER['SERVER_NAME']找到一个替代方案。

  3. 如果协议和端口分别为http, 80https, 443,则不需要添加:$port

0

我觉得这个方法没问题。我认为你不能以其他方式做到这一点。

+2

总是使用引用来支持你的答案,不要使用像“我认为/我想的”这样的概念,他们没有任何结论。 –