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

Ctr*_*Dot 137 php iis

我将WordPress安装移动到Windows/IIS服务器上的新文件夹.我在PHP中设置301重定向,但它似乎没有工作.我的帖子网址格式如下:

http:://www.example.com/OLD_FOLDER/index.php/post-title/
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何抓取/post-title/URL 的一部分.

$_SERVER["REQUEST_URI"] - 每个人似乎都建议 - 返回一个空字符串.$_SERVER["PHP_SELF"]刚刚回来index.php.为什么会这样,我该如何解决?

Vin*_*vic 135

也许,因为你在IIS下,

$_SERVER['PATH_INFO']
Run Code Online (Sandbox Code Playgroud)

是您想要的,基于您用来解释的URL.

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

  • -1:$ _SERVER ['PATH_INFO']未在我的系统中定义. (19认同)
  • oops,drat - 刚才意识到这个问题是关于IIS的,我正在使用.对不起,请选择downvote. (6认同)

Tyl*_*ter 63

$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;
Run Code Online (Sandbox Code Playgroud)

  • OP明确声明IIS - REQUEST_URI在IIS下不可用 (11认同)
  • @Stan,使用单打而不是双打,净效果为零.无,nadda,zip,零.这是PHP3时代的一个古老的故事.请不要对内容进行如此微不足道的修改. (7认同)
  • @TomAuger您需要查看时间表.在我回答这个问题之后,OP加了很久.在我回答之前大约一年,问了原来的问题. (2认同)

cwd*_*cwd 36

对于Apache:

'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']
Run Code Online (Sandbox Code Playgroud)


您也可以使用Herman评论HTTP_HOST而不是SERVER_NAME.有关完整讨论,请参阅此相关问题.简而言之,使用其中任何一个都可以.这是'主机'版本:

'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']
Run Code Online (Sandbox Code Playgroud)


对于偏执狂/为什么重要

通常情况下,我设置ServerNameVirtualHost,因为我想典型的网站的形式.该$_SERVER['HTTP_HOST']基于请求头设置.如果服务器响应该IP地址上的任何/所有域名,则用户可以欺骗标题,或者更糟糕的是,有人可能将DNS记录指向您的IP地址,然后您的服务器/网站将提供具有动态的网站建立在错误网址上的链接.如果您使用后一种方法,您还应配置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
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.这个答案的真正目的只是为那些在搜索到获取完整URL的方法时最终到达这里的人提供第一行代码:)

  • 这应该使用`$ _SERVER ['HTTP_HOST']`而不是`$ _SERVER ['SERVER_NAME']`.如果存在虚拟主机设置,则SERVER_NAME将显示该名称.它可能类似于`*.example.com`,它是无效的. (2认同)

Gre*_*reg 11

$_SERVER['REQUEST_URI'] 在IIS上不起作用,但我确实发现了这个: http://neosmart.net/blog/2006/100-apache-compliant-request_uri-for-iis-and-windows/听起来很有希望.


小智 9

使用此类可以获取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;
Run Code Online (Sandbox Code Playgroud)

  • 这不是有点矫枉过正吗? (10认同)

小智 7

加:

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

然后只需调用该my_url函数.


Jrg*_*gns 5

我使用以下函数来获取当前的完整URL.这应该适用于IIS和Apache.

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;
}
Run Code Online (Sandbox Code Playgroud)