33

現在の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"になると、間違って出力されます。

サブドメインを2回印刷しますが、理由がわかりません。

私の.htaccessファイルには、.php拡張子を削除できるように書き直したものがあります。

私を助けてくれる/助けたい人はいますか?:)

4

2 に答える 2

68

$_SERVER['REQUEST_URI']代わりに$_SERVER['SCRIPT_NAME']、cos$_SERVER['SCRIPT_NAME']が常に現在機能しているファイルを提供します。

マニュアルから:

SCRIPT_NAME:現在のスクリプトのパスが含まれます。これは、自分自身を指す必要があるページに役立ちます。定数には、現在の(つまり含まれている)ファイルの__FILE__フルパスとファイル名が含まれます。。

これは、現在のURLを完全に取得するのに役立つと思います。

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

注意:クライアントHTTP_HOSTに依存しないでください。代わりに使用してSERVER_NAMEください。参照:PHPのHTTP_HOSTとSERVER_NAMEの違いは何ですか?

セキュリティ警告

$_SERVER['REQUEST_URI'](データベースに印刷または保存するために)どこでも使用する場合は、フィルタリング(サニタイズ)する必要があります。これは安全ではありません。

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

したがって、ユーザー入力を使用する前に、必ずユーザー入力をフィルタリングしてください。少なくとも、、などを使用htmlspecialcharshtmlentitiesstrip_tagsください。

またはこのようなもの;

function get_current_url($strip = true) {
    static $filter, $scheme, $host, $port; 
    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']));
}
于 2013-02-16T17:49:47.937 に答える
0
$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'], '/'). '/';
}
于 2017-03-19T18:52:26.987 に答える