it-swarm.com.ru

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

Я использую:

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

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

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

Как это сделать?.

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

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

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

15
Rocket Spaceman

Это просто - используя функцию dirname дважды :)

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

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

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

echo dirname(dirname($url));
31
hek2mgl

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

dirname($_SERVER['PHP_SELF'])

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

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

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

спасибо, сэр https://stackoverflow.com/users/171318/hek2mgl

2
Dienastya Galih Pradana

Я не предлагаю использовать 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(). Но если это важно для вас, вы можете удалить последний символ .

1
mgutt

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

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

1
Timo Huovinen

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

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

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

Правка:

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

0
Sid