因为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;
}
这是完美的方法,还是他们的更好的替代方案?
答案 0 :(得分:1)
这是制作绝对URI的“教科书”方式。
我想强调一些警告。
$_SERVER['HTTPS']
可能并不总是被定义;在这种情况下应该检查$_SERVER['SERVER_PORT'] == 443
的条件;如果您是通过HTTP转发流量的HTTPS负载均衡器,并且上述方法都不起作用,则可能需要对其进行硬编码。
$_SERVER['HTTP_HOST']
也不总是被定义;这很少发生,HTTP/0.9
没有定义它,一些家庭酿造HTTP脚本可能无法通过它。您可以查看$_SERVER['SERVER_NAME']
以找到替代方案。
如果协议和端口分别为http, 80
或https, 443
,则无需添加:$port
。
答案 1 :(得分:0)
我认为这种方法还可以。我认为你不能以其他方式做到这一点。
答案 2 :(得分:0)
Location头字段中的绝对路径很好。不要担心它是一个完整的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