Как распечатать текущий URL-адрес?

Я хочу распечатать текущий URL-адрес, но мой код не работает.

Я использую это в файле file.php

echo "http://".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'];

Когда я открываю URL-адрес http://sub.mydomain.com/file.php, он работает нормально, и он печатает "http://sub.mydomain.com/file.php"

Но если я удалю расширение.php, поэтому URL-адрес будет http://sub.mydomain.com/file, он напечатает "http://sub.mydomain.com/sub/file.php" что неверно.

Он печатает субдомен дважды, и я не знаю почему?

В моем файле.htaccess у меня есть переписывание, которое позволяет удалять расширения.php.

Любой, кто может/хочет помочь мне, пожалуйста? :)

Ответ 1

Вам нужен $_SERVER['REQUEST_URI'] вместо $_SERVER['SCRIPT_NAME'], потому что $_SERVER['SCRIPT_NAME'] всегда даст вам файл, который работает в данный момент.

Из руководства:

SCRIPT_NAME: содержит текущий путь к сценарию. Это полезно для страниц, которые должны указывать на себя. Константа __FILE__ содержит полный путь и имя файла текущего (т.е. включенного) файла.,

Я полагаю, это поможет вам полностью получить текущий URL.

echo 'http://'. $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];

Примечание: НЕ ПОЛЬЗУЙТЕСЬ НА HTTP_HOST КЛИЕНТА, ИСПОЛЬЗУЙТЕ SERVER_NAME ВМЕСТО! СМ. В чем разница между HTTP_HOST и SERVER_NAME в PHP?

Предупреждение о безопасности

Вам нужно отфильтровать (очистить) $_SERVER['REQUEST_URI'], если вы используете его где-либо (для печати или хранения в базе данных), потому что это небезопасно.

// ie: this could be harmfull
/user?id=123%00%27<script...

Следовательно, всегда фильтруйте пользовательские вводы перед их использованием. По крайней мере, используйте htmlspecialchars, htmlentities, strip_tags и т.д.

Или что-то вроде этого;

function get_current_url($strip = true) {
    // static sanitizer, 'cos function could be called many times
    static $filter; if ($filter == null) {
        $filter = function($input) use($strip) {
            $input = trim($input);
            if ($input == '/') {
                return $input;
            }

            // add more chars if needed
            $input = str_ireplace(["\0", '%00', "\x0a", '%0a', "\x1a", '%1a'], '',
                rawurldecode($input));

            // remove markup stuff
            if ($strip) {
                $input = strip_tags($input);
            }

            // or any encoding you use instead of utf-8
            $input = htmlspecialchars($input, ENT_QUOTES, 'utf-8');

            return $input;
        };

        $scheme = isset($_SERVER['REQUEST_SCHEME']) ? $_SERVER['REQUEST_SCHEME']
            : ('http'. (($_SERVER['SERVER_PORT'] == '443') ? 's' : ''));
        $host = $_SERVER['SERVER_NAME'];
        $port = ($_SERVER['SERVER_PORT'] != '80' && $scheme != 'https')
            ? (':'. $_SERVER['SERVER_PORT']) : '';
        }
    }

    return sprintf('%s://%s%s%s', $scheme, $host, $port, $filter($_SERVER['REQUEST_URI']));
}

Ответ 2

$main_folder = str_replace('\\','/',dirname(__FILE__) );
$document_root = str_replace('\\','/',$_SERVER['DOCUMENT_ROOT'] );
$main_folder = str_replace( $document_root, '', $main_folder);
if( $main_folder ) {
    $current_url = $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['SERVER_NAME']. '/' . ltrim( $main_folder, '/' ) . '/';
} else {
    $current_url = $_SERVER['REQUEST_SCHEME'].'://'.rtrim( $_SERVER['SERVER_NAME'], '/'). '/';
}