Как я могу получить полный 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 ]

1 голос
/ 21 ноября 2013

О, веселье отрывка!

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 /141769/kak-ya-mogu-poluchit-polnyi-url-tekuschei-stranitsy-na-servere-windows-iis:

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/"
//      }
0 голосов
/ 30 августа 2016

Поддержка обратного прокси!

Что-то более надежное. Примечание Это будет работать только на 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'])), '/'));
}
0 голосов
/ 21 декабря 2014

На моем сервере Apache это дает мне полный URL в точном формате, который вы ищете:

$_SERVER["SCRIPT_URI"]
0 голосов
/ 21 октября 2013

Все забыли http_build_url ?

http_build_url($_SERVER['REQUEST_URI']);

Когда никакие параметры не передаются в http_build_url, он автоматически принимает текущий URL. Я ожидаю, что REQUEST_URI также будет включен, хотя, по-видимому, это необходимо для включения параметров GET.

Приведенный выше пример вернет полный URL.

0 голосов
/ 18 января 2010

Я использовал следующий код и получаю правильный результат ...

<?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();
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...