Получение полного URL-адреса текущей страницы (PHP)

Я работаю над этой страницей: http://localhost/projectname/custom.php

И <?php echo $_SERVER['REQUEST_URI']; ?>, и <?php echo $PHP_SELF; ?> не указывают полное местоположение. Что мне следует использовать, чтобы получить полный адрес URL?


person eozzy    schedule 10.02.2010    source источник


Ответы (5)


Насколько я знаю, нативного метода не существует, но вы можете использовать его:

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;
}
person harpax    schedule 10.02.2010
comment
Было бы неплохо, если бы вы также проверили $_SERVER["SERVER_PROTOCOL"], чтобы узнать протокол. - person PhoneixS; 14.05.2014
comment
@PhoneixS Предположим, это HTTP / 1.1 ... что мне с этим делать? - person Michael; 10.12.2014
comment
@Michael, вы знаете, что это протокол http, поэтому вы можете добавить http к URL-адресу. В этом ответе вы предположили, что все запросы являются http, но можно использовать другие протоколы для обслуживания файлов (например, на сервере apache с mod_ftp, я думаю, это может быть ftp). - person PhoneixS; 11.12.2014
comment
@PhoneixS А, ладно, похоже, это не то, что я мог бы использовать напрямую, т.е. мне нужно сопоставить HTTP / 1.1 (или HTTP / 1.0 или что-то еще) с http: //, за исключением того, что это может быть https: // вместо этого, и поэтому я действительно не знаю, какие другие возможные значения могут соответствовать чему. В любом случае это не кажется простым отображением 1: 1, требуется некоторая интерпретация. - person Michael; 11.12.2014
comment
@Michael, вы можете сделать, как @Sorantis answer strleft(strtolower($_SERVER["SERVER_PROTOCOL"]), "/"), чтобы извлечь протокол. Очень странно, что вы увидите сервер, настроенный для обслуживания php-страниц через протокол, отличный от http, поэтому обычно можно пропустить эту проверку. Я прокомментировал это только в том случае, если вы были одним из этих странных серверов. - person PhoneixS; 12.12.2014
comment
Что мне здесь не хватает, так это порт для ssl. При подключении по ssl порт нужно добавить если не 443, то 80 - person André van Schoubroeck; 27.03.2015

Если вы пытаетесь добавить переменные обратно в конец 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);

В данном случае «ссылка», «идентификатор» и «тип» были переменными, которые мне были нужны для отслеживания, но URL-адрес, который я хотел отслеживать, имел переменную на конце, которая была удалена моим сценарием, как если бы она была часть отправляемого к нему запроса; Мне нужно было добавить его обратно в URL-адрес ссылки, прежде чем передавать его в заголовок ("Location:". $ Link).

Если это то, чего вы пытаетесь достичь, это отлично работает и короче, чем в приведенном выше примере.

person Nancy Hastings-Trew    schedule 23.10.2013

проверьте этот ... немного длинный и грязный, но работает хорошо ...

 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;
  }
person Teja Kantamneni    schedule 10.02.2010

Я нашел этот код очень полезным

$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;
person Muhammad Ashikuzzaman    schedule 20.05.2014
comment
подождите ... $ _SERVER ['SERVER_PROTOCOL'] == HTTP / 1.1 даже при использовании https! - person Michael; 10.12.2014

person    schedule
comment
Кажется, идет с этого сайта: dev.kanngard.net/Permalinks/ID_20050507183447.html - person Frosty Z; 04.08.2011
comment
strleft не существует (по крайней мере, в последних версиях PHP). - person pr1001; 09.10.2013
comment
pr1001 - strleft - это не встроенная функция в php, а пользовательская функция - person user8455694; 16.02.2018