web-dev-qa-db-fra.com

Comment imprimer le chemin actuel de l'URL?

Je souhaite imprimer le chemin actuel de l'URL, mais mon code ne fonctionne pas correctement.

Je l'utilise dans mon fichier.php

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

Quand j'ouvre l'URL http://sub.mydomain.com/file.php il semble bien fonctionner, et il imprime "http://sub.mydomain.com/file.php"

Mais si je supprime l'extension .php pour que l'url soit http://sub.mydomain.com/file à la place , il imprime "http://sub.mydomain.com/sub/file.php" ce qui est faux.

Il imprime le sous-domaine deux fois, et je ne sais pas pourquoi?

Dans mon fichier .htaccess, j'ai une réécriture qui permet de supprimer les extensions .php.

Quelqu'un qui peut/veut m'aider s'il vous plaît? :)

33
TheYaXxE

Vous avez besoin $_SERVER['REQUEST_URI'] au lieu de $_SERVER['SCRIPT_NAME'], cos $_SERVER['SCRIPT_NAME'] vous donnera toujours le fichier qui fonctionne actuellement.

De manuel:

SCRIPT_NAME: contient le chemin du script actuel. Ceci est utile pour les pages qui doivent se désigner. Le __FILE__ constante contient le chemin d'accès complet et le nom du fichier actuel (inclus). .

Je suppose que cela vous aide à obtenir l'URL actuelle pleinement.

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

Avis: ne comptez pas sur les clients HTTP_Host, UTILISATION SERVER_NAME AU LIEU! VOIR: Quelle est la différence entre HTTP_Host et SERVER_NAME en PHP?

Avertissement de sécurité

Vous devez filtrer (désinfecter) $_SERVER['REQUEST_URI'] si vous l’utilisez n'importe où (pour imprimer ou stocker dans une base de données), cela n’est pas sûr.

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

Par conséquent, filtrez toujours les entrées utilisateur avant de les utiliser. Utilisez au moins htmlspecialchars, htmlentities, strip_tags etc..

Ou quelque chose comme ça;

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']));
}
67
K-Gun
$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'], '/'). '/';
}
0
Sinan Tekmil