Как безопасно получить полный URL-адрес родительского каталога текущей страницы PHP

Я использую:

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

Но это, конечно, дает полный URL. Вместо этого мне нужен полный URL минус текущий файл и один каталог и минус конечная черта.

поэтому независимо от того, какой домен URL-адреса браузера, например, localhost, https://, http://и т.д., передается полный реальный (обходя любой переупорядоченный мод) путь URL-адреса родительского каталога без конечной косой черты.

Как это делается? Безопасно, поэтому XSS, как я полагаю (от чтения), используя что-либо, кроме "SCRIPT_NAME", не имеет такого риска. Не уверен, хотя он... просто читал тонну, пытаясь понять это.

примеры: если дано:

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

необходимо:

https://stackoverflow.com/questions

без конечной косой черты.

и должен также работать, например:

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

чтобы получить

http://localhost/GetSimple

что я пытаюсь сделать.

Спасибо.



Edit: Здесь рабочее решение, которое я использовал:
$url  = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
$url .= $_SERVER['SERVER_NAME'];
$url .= htmlspecialchars($_SERVER['REQUEST_URI']);
$themeurl = dirname(dirname($url)) . "/theme";

он отлично работает.

Ответы

Ответ 1

Это легко - с помощью функции dirname дважды:)

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

Также обратите внимание на комментарий @Sid. Когда вам нужен полный uri для текущего script, с протоколом и сервером, используйте что-то вроде этого:

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

echo dirname(dirname($url));

Ответ 2

У меня есть более простой синтаксис, чтобы получить родительские addres с портом и URL-адресом попробуй мой код

dirname($_SERVER['PHP_SELF'])

с помощью этого кода вы можете получить непосредственного родителя adres если вы хотите, чтобы 2-х обратный каталог назад, вы можете выполнить цикл

dirname(dirname($_SERVER['PHP_SELF']))

dirname - это fungtion для получения родительского веб-сайта addrest, а $_SERVER ['PHP_SELF'] может показывать текущую сеть addres.

thakyou Sir https://stackoverflow.com/users/171318/hek2mgl

Ответ 3

Этот пример работает с портами

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>';

Источник: fooobar.com/questions/11671/...

Ответ 4

Я не предлагаю использовать 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 var вы используете, и, конечно, он работает только для этой конкретной проблемы. Гораздо лучшим общим решением было бы использовать 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.

Ответ 5

Я с hek2mgl. Однако на всякий случай, если script не всегда определенно 2 каталога ниже вашей цели, вы можете использовать explode:

$parts = explode("/",ltrim($_SERVER['SCRIPT_NAME'],"/"));
echo $_SERVER['HTTP_HOST'] . "/" . $parts[0];

Ответ 6

Как упоминалось в hek2mgl, это правильно, и более динамичный подход будет dirname(dirname(htmlspecialchars($_SERVER['REQUEST_URI'])));.

EDIT:

$_ SERVER ['REQUEST_URI'] не укажет доменное имя. Ссылаясь на сообщение @hek2mgl, вы можете echo dirname(dirname(htmlspecialchars($url)));

Ответ 7

Вот полезные команды для получения желаемого пути:

(Например, вы выполняете команду 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

Примеры:

* HOME url               ( yoursite.com )

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

* файл BASE url     ( yoursite.com/anyfolder/myfile.php )

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

* COMPLETE current url ( yoursite.com/anyfolder/myfile.php?action=blabla )

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

* 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);
?>

p.s.for wordpress, существуют уже заранее определенные функции для получения плагинов или URL-адресов тем.

i.e. get plugin folder ( http://yoursite.com/wp-content/plugins/pluginName/ )
<?php echo plugin_dir_url( __FILE__ );?>