如何在 Windows/IIS 服务器上获取当前页面的完整 URL?

我将 WordPress安装移动到 Windows/IIS服务器上的一个新文件夹中。我正在用 PHP 设置301重定向,但它似乎不起作用。我的博文网址有以下格式:

http:://www.example.com/OLD_FOLDER/index.php/post-title/

我不知道如何获取网址的 /post-title/部分。

$_SERVER["REQUEST_URI"]-似乎每个人都建议-返回一个空字符串。$_SERVER["PHP_SELF"]正在返回 index.php。为什么会这样,我该怎么补救?

334217 次浏览

也许,因为你是 IIS 的人,

$_SERVER['PATH_INFO']

是你想要的,基于你用来解释的 URL。

对于 Apache,可以使用 $_SERVER['REQUEST_URI']

REQUEST _ URI 是由 Apache 设置的,所以您不能使用 IIS 获得它。尝试在 $_ SERVER 上执行 var _ dump 或 print _ r 操作,看看存在哪些值可以使用。

网址的 posttitle 部分位于 index.php文件之后,这是提供友好 URL 而不使用 mod _ rewrite 的常用方法。因此 posttitle 实际上是查询字符串的一部分,所以您应该能够使用 $_ SERVER [‘ QUERY _ STRING’]获取它

我使用以下函数来获得当前的完整 URL。

function get_current_url() {


$protocol = 'http';
if ($_SERVER['SERVER_PORT'] == 443 || (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on')) {
$protocol .= 's';
$protocol_port = $_SERVER['SERVER_PORT'];
} else {
$protocol_port = 80;
}


$host = $_SERVER['HTTP_HOST'];
$port = $_SERVER['SERVER_PORT'];
$request = $_SERVER['PHP_SELF'];
$query = isset($_SERVER['argv']) ? substr($_SERVER['argv'][0], strpos($_SERVER['argv'][0], ';') + 1) : '';


$toret = $protocol . '://' . $host . ($port == $protocol_port ? '' : ':' . $port) . $request . (empty($query) ? '' : '?' . $query);


return $toret;
}
$pageURL = (@$_SERVER["HTTPS"] == "on") ? "https://" : "http://";
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;

我已经使用了下面的代码,我得到了正确的结果..。

<?php
function currentPageURL() {
$curpageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {
$curpageURL.= "s";
}
$curpageURL.= "://";
if ($_SERVER["SERVER_PORT"] != "80") {
$curpageURL.= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
}
else {
$curpageURL.= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $curpageURL;
}
echo currentPageURL();
?>

地址:

function my_url(){
$url = (!empty($_SERVER['HTTPS'])) ?
"https://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] :
"http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
echo $url;
}

然后调用 my_url函数。

使用此类可以使 URL 工作。

class VirtualDirectory
{
var $protocol;
var $site;
var $thisfile;
var $real_directories;
var $num_of_real_directories;
var $virtual_directories = array();
var $num_of_virtual_directories = array();
var $baseURL;
var $thisURL;


function VirtualDirectory()
{
$this->protocol = $_SERVER['HTTPS'] == 'on' ? 'https' : 'http';
$this->site = $this->protocol . '://' . $_SERVER['HTTP_HOST'];
$this->thisfile = basename($_SERVER['SCRIPT_FILENAME']);
$this->real_directories = $this->cleanUp(explode("/", str_replace($this->thisfile, "", $_SERVER['PHP_SELF'])));
$this->num_of_real_directories = count($this->real_directories);
$this->virtual_directories = array_diff($this->cleanUp(explode("/", str_replace($this->thisfile, "", $_SERVER['REQUEST_URI']))),$this->real_directories);
$this->num_of_virtual_directories = count($this->virtual_directories);
$this->baseURL = $this->site . "/" . implode("/", $this->real_directories) . "/";
$this->thisURL = $this->baseURL . implode("/", $this->virtual_directories) . "/";
}


function cleanUp($array)
{
$cleaned_array = array();
foreach($array as $key => $value)
{
$qpos = strpos($value, "?");
if($qpos !== false)
{
break;
}
if($key != "" && $value != "")
{
$cleaned_array[] = $value;
}
}
return $cleaned_array;
}
}


$virdir = new VirtualDirectory();
echo $virdir->thisURL;

在使用 $_SERVER['REQUEST_URI']的 PHP 页面顶部使用以下行。这将解决您的问题。

$_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF'] . '?' . $_SERVER['argv'][0];

对于 Apache:

'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']


您也可以使用 HTTP_HOST而不是如 Herman 所说的 SERVER_NAME。有关完整的讨论,请参见 这个相关的问题。简而言之,您可能对使用这两种方法都没有问题。以下是“主机”版本:

'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']


为了偏执狂/为什么这很重要

通常,我在 VirtualHost中设置 ServerName,因为我希望 那个是网站的 规范形式。$_SERVER['HTTP_HOST']是根据请求头设置的。如果服务器响应任何/所有的域名在该 IP 地址,用户可以欺骗的标题,或更糟糕的是,有人可以指向一个 DNS 记录到您的 IP 地址,然后您的服务器/网站将提供一个网站的动态链接建立在一个不正确的 URL。如果您使用后一种方法,您还应该配置您的 vhost或设置一个 .htaccess规则来强制执行您想要提供的域,比如:

RewriteEngine On
RewriteCond %{HTTP_HOST} !(^stackoverflow.com*)$
RewriteRule (.*) https://stackoverflow.com/$1 [R=301,L]
#sometimes u may need to omit this slash ^ depending on your server

希望能帮上忙。这个答案的真正目的只是为那些在搜索使用 apache 获取完整 URL 的方法时最终到达这里的人提供第一行代码:)

大家都忘了 http_build_url吗?

http_build_url($_SERVER['REQUEST_URI']);

当没有参数传递给 http_build_url时,它将自动假定当前 URL。我希望也包含 REQUEST_URI,尽管似乎需要它才能包含 GET 参数。

上面的示例将返回完整的 URL。

哦,一个片段的乐趣!

if (!function_exists('base_url')) {
function base_url($atRoot=FALSE, $atCore=FALSE, $parse=FALSE){
if (isset($_SERVER['HTTP_HOST'])) {
$http = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
$hostname = $_SERVER['HTTP_HOST'];
$dir =  str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);


$core = preg_split('@/@', str_replace($_SERVER['DOCUMENT_ROOT'], '', realpath(dirname(__FILE__))), NULL, PREG_SPLIT_NO_EMPTY);
$core = $core[0];


$tmplt = $atRoot ? ($atCore ? "%s://%s/%s/" : "%s://%s/") : ($atCore ? "%s://%s/%s/" : "%s://%s%s");
$end = $atRoot ? ($atCore ? $core : $hostname) : ($atCore ? $core : $dir);
$base_url = sprintf( $tmplt, $http, $hostname, $end );
}
else $base_url = 'http://localhost/';


if ($parse) {
$base_url = parse_url($base_url);
if (isset($base_url['path'])) if ($base_url['path'] == '/') $base_url['path'] = '';
}


return $base_url;
}
}

它有美丽的回报,如:

// A URL like http://stackoverflow.com/questions/189113/how-do-i-get-current-page-full-url-in-php-on-a-windows-iis-server:


echo base_url();    // Will produce something like: http://stackoverflow.com/questions/189113/
echo base_url(TRUE);    // Will produce something like: http://stackoverflow.com/
echo base_url(TRUE, TRUE); || echo base_url(NULL, TRUE); //Will produce something like: http://stackoverflow.com/questions/


// And finally:
echo base_url(NULL, NULL, TRUE);
// Will produce something like:
//      array(3) {
//          ["scheme"]=>
//          string(4) "http"
//          ["host"]=>
//          string(12) "stackoverflow.com"
//          ["path"]=>
//          string(35) "/questions/189113/"
//      }

在我的 apache 服务器中,这将为我提供您正在查找的完整 URL 的确切格式:

$_SERVER["SCRIPT_URI"]

反向代理支持!

一些更强大的东西。 注意它只能在 5.3或更大的。

/*
* Compatibility with multiple host headers.
* Support of "Reverse Proxy" configurations.
*
* Michael Jett <mjett@mitre.org>
*/


function base_url() {


$protocol = @$_SERVER['HTTP_X_FORWARDED_PROTO']
?: @$_SERVER['REQUEST_SCHEME']
?: ((isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") ? "https" : "http");


$port = @intval($_SERVER['HTTP_X_FORWARDED_PORT'])
?: @intval($_SERVER["SERVER_PORT"])
?: (($protocol === 'https') ? 443 : 80);


$host = @explode(":", $_SERVER['HTTP_HOST'])[0]
?: @$_SERVER['SERVER_NAME']
?: @$_SERVER['SERVER_ADDR'];


// Don't include port if it's 80 or 443 and the protocol matches
$port = ($protocol === 'https' && $port === 443) || ($protocol === 'http' && $port === 80) ? '' : ':' . $port;


return sprintf('%s://%s%s/%s', $protocol, $host, $port, @trim(reset(explode("?", $_SERVER['REQUEST_URI'])), '/'));
}