因为header("Location: ");
标头需要与绝对路径而不是相对路径一起使用,所以我使用$_SERVER
变量组成了这个函数来获取绝对路径。
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;
}
这是这样做的完美方法,还是更好的选择?
这是制作绝对 URI 的"教科书"方式。
我想强调一些注意事项。
-
$_SERVER['HTTPS']
可能并不总是被定义;在这种情况下,应该检查$_SERVER['SERVER_PORT'] == 443
的条件;如果你在通过HTTP转发流量的HTTPS负载均衡器后面,并且上述方法都不起作用,你可能必须对其进行硬编码。 -
$_SERVER['HTTP_HOST']
也不总是定义的;这种情况很少发生,HTTP/0.9
没有定义它,一些自制的HTTP脚本可能无法通过它。您可以查看$_SERVER['SERVER_NAME']
以找到替代方案。 -
如果协议和端口分别为
http, 80
或https, 443
,则无需添加:$port
。
我认为这种方法还可以。我不认为你可以用其他方式做到这一点。
位置标头字段中的绝对路径很好。不要担心使其成为完整的 URI。查看 http://trac.tools.ietf.org/wg/httpbis/trac/ticket/185 和 http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p2-semantics-21.html#header.location