17

私が使用しているもの:

$domain = $_SERVER['HTTP_HOST'];
$path = $_SERVER['SCRIPT_NAME'];
$themeurl = $domain . $path;

しかし、これはもちろん完全なURLを提供します。代わりに、完全なURLから現在のファイルと1つのディレクトリを差し引いて、末尾のスラッシュを差し引いたものが必要です

したがって、ブラウザのURLドメインがlocalhost、https://、http://などであるかどうかに関係なく、親ディレクトリの完全な実際の(modの書き換えをバイパスする)URLパスは、末尾にスラッシュを付けずに指定されます。

これはどのように行われますか?「SCRIPT_NAME」以外のものを使用して(読んで)推測するXSSは安全ではないので、そのようなリスクがあります。

例:与えられた場合:

https://stackoverflow.com/questions/somequestions/index.php

必要:

https://stackoverflow.com/questions

末尾のスラッシュなし。

また、次のように機能する必要があります。

http://localhost/GetSimple/admin/load.php

取得するため

http://localhost/GetSimple

それが私がやろうとしていることです。

ありがとうございました。



編集: これが私が使用した実用的なソリューションです:

$url  = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
$url .= $_SERVER['SERVER_NAME'];
$url .= htmlspecialchars($_SERVER['REQUEST_URI']);
$themeurl = dirname(dirname($url)) . "/theme";

それは完璧に動作します。

4

7 に答える 7

35

それは簡単です-関数をdirname2回使用します:)

echo dirname(dirname('https://stackoverflow.com/questions/somequestions/index.php'));

@Sid のコメントにも注意してください。現在のスクリプトへの完全な uri が必要な場合は、プロトコルとサーバーを次のように使用します。

$url  = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
$url .= $_SERVER['SERVER_NAME'];
$url .= $_SERVER['REQUEST_URI'];

echo dirname(dirname($url));
于 2013-02-27T11:03:19.007 に答える
2

dirname()URI ではなくディレクトリにそのまま使用することはお勧めしません。例:

  • dirname("http://example.com/foo/index.php")戻り値http://example.com/foo
  • dirname("http://example.com/foo/")戻り値http://example.com
  • dirname("http://example.com/")戻り値http:
  • dirname("http://example.com")戻り値http:

したがって、どの変数を使用するかは非常に慎重にする$_SERVER必要があり、もちろん、この特定の問題に対してのみ機能します。はるかに優れた一般的な解決策は、currentdir()を使用することです。これに基づいて、これを使用して親ディレクトリを取得できます。

function parentdir($url) {
    // note: parent of "/" is "/" and parent of "http://example.com" is "http://example.com/"
    // remove filename and query
    $url = currentdir($url);
    // get parent
    $len = strlen($url);
    return currentdir(substr($url, 0, $len && $url[ $len - 1 ] == '/' ? -1 : $len));
}

例:

  • parentdir("http://example.com/foo/bar/index.php")戻り値 http://example.com/foo/
  • parentdir("http://example.com/foo/index.php")戻り値http://example.com/
  • parentdir("http://example.com/foo/")戻り値http://example.com/
  • parentdir("http://example.com/")戻り値http://example.com/
  • parentdir("http://example.com")戻り値http://example.com/

したがって、はるかに安定した結果が得られます。末尾のスラッシュを削除したい理由を説明できるかもしれません。私の経験では、「/ foo」という名前のファイルと、を使用しないと同じ名前のフォルダーを区別できないため、より多くの問題が発生しますis_dir()。ただし、これが重要な場合は、最後の char を削除できます。

于 2015-04-01T20:52:19.227 に答える
1

この例はポートで動作します

function full_url($s)
{
    $ssl = (!empty($s['HTTPS']) && $s['HTTPS'] == 'on') ? true:false;
    $sp = strtolower($s['SERVER_PROTOCOL']);
    $protocol = substr($sp, 0, strpos($sp, '/')) . (($ssl) ? 's' : '');
    $port = $s['SERVER_PORT'];
    $port = ((!$ssl && $port=='80') || ($ssl && $port=='443')) ? '' : ':'.$port;
    $host = isset($s['HTTP_HOST']) ? $s['HTTP_HOST'] : $s['SERVER_NAME'];
    return $protocol . '://' . $host . $port . $s['REQUEST_URI'];
}
$themeurl = dirname(dirname(full_url($_SERVER))).'/theme';
echo '<a href="'.htmlspecialchars($themeurl,ENT_QUOTES,'UTF-8').'">Theme URL</a>';

ソース: https://stackoverflow.com/a/8891890/175071

于 2013-12-06T10:26:09.307 に答える
0

私はhek2mglと一緒です。ただし、スクリプトがターゲットの 2 ディレクトリ下にあるとは限らない場合に備えて、explode を使用できます。

$parts = explode("/",ltrim($_SERVER['SCRIPT_NAME'],"/"));
echo $_SERVER['HTTP_HOST'] . "/" . $parts[0];
于 2013-02-27T11:09:11.327 に答える
0

hek2mgl が述べたように、それは正しく、より動的なアプローチはdirname(dirname(htmlspecialchars($_SERVER['REQUEST_URI'])));.

編集:

$_SERVER['REQUEST_URI'] はドメイン名を省略します。@hek2mgl の投稿を参照すると、次のことができます。echo dirname(dirname(htmlspecialchars($url)));

于 2013-02-27T11:09:11.560 に答える
-2

目的のパスを取得するための便利なコマンドを次に示します。

(たとえば、http:// yoursite.com/folder1/folder2/file.phpで実行しています)

__FILE__   (on L.Hosting)   === /home/xfiddlec/http_docs/folder1/folder2/yourfile.php
__FILE__   (on Localhost) === C:\wamp\www\folder1\folder2\yourfile.php 
$_SERVER['HTTP_HOST']     === www.yoursite.com (or without WWW)   
$_SERVER["PHP_SELF"]      === /folder1/folder2/yourfile.php
$_SERVER["REQUEST_URI"]   === /folder1/folder2/yourfile.php?var=blabla
$_SERVER["DOCUMENT_ROOT"] === /home/xfiddlec/http_docs

// BASENAME and DIRNAME (lets say,when __file__ is '/folder1/folder2/yourfile.php'
basename(__FILE__)  ==== yourfile.php
dirname(__FILE__)   ==== /folder1/folder2

例:

*ホームURL             ( yoursite.com )

<?php echo $_SERVER['HTTP_HOST'];?>

*ファイルのベース URL     ( yoursite.com/anyfolder/myfile.php )

<?php echo $_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; ?>

*完全な現在の URL( yoursite.com/anyfolder/myfile.php?action=blabla )

<?php echo $_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"];?>

*CURRENT FOLDERのURL( yoursite.com/anyfolder/ )

<?php echo $_SERVER['HTTP_HOST'] . dirname($_SERVER['REQUEST_URI']);  ?>

*ファイルへの RealPath を取得するには (含まれている場合でも) (/var/public_html を目的のルートに変更します)

<?php
$cur_file=str_replace('\\','/',__FILE__); //Then Remove the root path::
$cur_file=preg_replace('/(.*?)\/var\/public_html/','',$cur_file);
?>

psfor wordpressには、プラグインまたはテーマの URL を取得するための定義済み関数が既に存在します。

i.e. get plugin folder ( http://yoursite.com/wp-content/plugins/pluginName/ )
<?php echo plugin_dir_url( __FILE__ );?>
于 2014-02-17T07:57:39.147 に答える