【发布时间】:2011-01-15 06:21:00
【问题描述】:
我正在处理这个页面:http://localhost/projectname/custom.php
<?php echo $_SERVER['REQUEST_URI']; ?> 和 <?php echo $PHP_SELF; ?> 都没有给出完整的位置。我应该使用什么来获取完整的 url 位置?
【问题讨论】:
标签: php scripting path location
我正在处理这个页面:http://localhost/projectname/custom.php
<?php echo $_SERVER['REQUEST_URI']; ?> 和 <?php echo $PHP_SELF; ?> 都没有给出完整的位置。我应该使用什么来获取完整的 url 位置?
【问题讨论】:
标签: php scripting path location
function selfURL()
{
$s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : "";
$protocol = strleft(strtolower($_SERVER["SERVER_PROTOCOL"]), "/").$s;
$port = ($_SERVER["SERVER_PORT"] == "80") ? "" : (":".$_SERVER["SERVER_PORT"]);
return $protocol."://".$_SERVER['SERVER_NAME'].$port.$_SERVER['REQUEST_URI'];
}
function strleft($s1, $s2) { return substr($s1, 0, strpos($s1, $s2)); }
【讨论】:
strleft 不存在(至少在最新版本的 PHP 中)。
据我所知,没有原生方法,但你可以使用这个:
function curPageURL() {
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80") {
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} else {
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $pageURL;
}
【讨论】:
$_SERVER["SERVER_PROTOCOL"]以了解协议可能会很好。
strleft(strtolower($_SERVER["SERVER_PROTOCOL"]), "/") 一样提取协议。很奇怪,您会看到配置为通过 http 以外的其他协议为 php 页面提供服务的服务器,因此通常可以省略此检查。我只是在你是这个奇怪的服务器之一的情况下才评论它。
例如,如果您尝试将变量添加回您通过链接跟踪脚本传递的 URL 的末尾,您可以尝试以下操作:
$URI = array();
foreach($_GET as $key=>$val)
{
if ($key!="link"&&$key!="id"&&$key!="type") $URI[] = "$key=".urlencode($val);
}
if (sizeof($URI)>0) $link.="&".join("&",$URI);
在这种情况下,“link”、“id”和“type”是我跟踪所需的变量,但我要跟踪的 URL 末尾有一个变量,它被我的脚本剥离为如果它是发送给它的查询的一部分;在将其传递给 header("Location:".$link) 之前,我需要将其添加回链接 URL。
如果这是您想要达到的效果,那么效果很好,并且比上面的示例要短。
【讨论】:
检查这个...有点长而且很脏但效果很好...
function absolutizeUrl ( $u, $p )
{
$url = parse_url( $u );
$page = parse_url( $p );
if ( strpos( $u , '/' ) === 0 )
{
//already absolute
} else {
$basePath = '';
if (
isset( $page[ 'path' ] )
&& strpos( ltrim( $page[ 'path' ], '/' ), '/' )
)
{
$baseTokens = explode( '/', $page[ 'path' ] );
array_pop( $baseTokens ); // strip basename
$baseTokens[] = $u;
$u = join( '/', $baseTokens );
}
}
if ( ! isset( $url[ 'host' ]))
{
$u = 'http://'.$page[ 'host' ].'/'.ltrim( $u, '/' );
}
return $u;
}
【讨论】:
我发现这段代码很有帮助
$protocol = strpos(strtolower($_SERVER['SERVER_PROTOCOL']),'https') ===
FALSE ? 'http' : 'https'; // Get protocol HTTP/HTTPS
$host = $_SERVER['HTTP_HOST']; // Get www.domain.com
$script = $_SERVER['SCRIPT_NAME']; // Get folder/file.php
$params = $_SERVER['QUERY_STRING'];// Get Parameters occupation=odesk&name=ashik
$currentUrl = $protocol . '://' . $host . $script . '?' . $params; // Adding all
echo $currentUrl;
【讨论】: