Как я могу получить полный URL текущей страницы на сервере Windows / IIS? - PullRequest
137 голосов
/ 10 октября 2008

Я переместил установку WordPress в новую папку на сервере Windows / IIS . Я настраиваю 301 переадресацию в PHP, но она не работает. URL моего поста имеют следующий формат:

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

Я не могу понять, как получить часть /post-title/ URL.

$_SERVER["REQUEST_URI"] - который, кажется, все рекомендуют - возвращает пустую строку. $_SERVER["PHP_SELF"] только что вернулся index.php. Почему это и как я могу это исправить?

Ответы [ 15 ]

135 голосов
/ 10 октября 2008

Может быть, потому что вы находитесь под IIS,

$_SERVER['PATH_INFO']

- это то, что вы хотите, основываясь на URL, которые вы использовали для объяснения.

Для Apache вы бы использовали $_SERVER['REQUEST_URI'].

63 голосов
/ 05 августа 2009
$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;
36 голосов
/ 13 апреля 2012

Для Apache:

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


Вы также можете использовать HTTP_HOST вместо SERVER_NAME, как прокомментировал Герман. См. этот связанный вопрос для полного обсуждения. Короче говоря, вы, вероятно, в порядке с использованием любого. Вот версия 'host':

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


Для параноиков / Почему это важно

Обычно я устанавливаю ServerName в VirtualHost, потому что я хочу , чтобы была канонической формой веб-сайта. $_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

Надеюсь, это поможет. Реальный смысл этого ответа состоял в том, чтобы просто предоставить первую строку кода для тех людей, которые оказались здесь при поиске способа получить полный URL с помощью apache:)

11 голосов
/ 10 октября 2008

$_SERVER['REQUEST_URI'] не работает на IIS, но я нашел это: http://neosmart.net/blog/2006/100-apache-compliant-request_uri-for-iis-and-windows/, что звучит многообещающе.

9 голосов
/ 19 декабря 2010

Используйте этот класс, чтобы получить 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;
7 голосов
/ 10 октября 2010

Добавить:

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.

5 голосов
/ 05 августа 2009

Я использую следующую функцию для получения текущего полного 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;
}
4 голосов
/ 10 октября 2008

REQUEST_URI устанавливается Apache, поэтому вы не получите его с IIS. Попробуйте сделать var_dump или print_r для $ _SERVER и посмотрите, какие значения существуют там, которые вы можете использовать.

3 голосов
/ 10 октября 2008

Часть заголовка URL с заголовком указывается после вашего файла index.php, который является обычным способом предоставления дружественных URL-адресов без использования mod_rewrite. Таким образом, посттитр является частью строки запроса, поэтому вы можете получить его, используя $ _SERVER ['QUERY_STRING']

2 голосов
/ 14 мая 2011

Используйте следующую строку в верхней части страницы PHP, где вы используете $_SERVER['REQUEST_URI']. Это решит вашу проблему.

$_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF'] . '?' . $_SERVER['argv'][0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...