Подтвердить что ты не робот

Получить базовый каталог текущего script

Это url моего script: localhost/do/index.php

Мне нужна переменная или функция, которая возвращает localhost/do (что-то вроде $_SERVER['SERVER_NAME'].'/do')

4b9b3361

Ответ 1

Try:

$url = $_SERVER['REQUEST_URI']; //returns the current URL
$parts = explode('/',$url);
print_r($parts);

EDIT:

$url = $_SERVER['REQUEST_URI']; //returns the current URL
$parts = explode('/',$url);
$dir = $_SERVER['SERVER_NAME'];
for ($i = 0; $i < count($parts) - 1; $i++) {
 $dir .= $parts[$i] . "/";
}
echo $dir;

Это должно возвращать localhost/do/

Ответ 2

$_SERVER['SERVER_NAME'] . dirname($_SERVER['REQUEST_URI']);

Ответ 3

php имеет множество функций для синтаксического анализа строк, которые могут выполняться с помощью простых однострочных фрагментов
dirname() (который вы просили) и parse_url() (который вам нужен) среди них

<?php

echo "Request uri is: ".$_SERVER['REQUEST_URI'];
echo "<br>";

$curdir = dirname($_SERVER['REQUEST_URI'])."/";

echo "Current dir is: ".$curdir;
echo "<br>";

адресная строка в браузере

http://localhost/do/index.php

вывод

Request uri is: /do/index.php
Current dir is: /do/

Ответ 4

Когда я выполнял некоторые из этих ответов, я столкнулся с несколькими проблемами, поскольку я использую IIS, и мне также нужен полный URL-адрес с протоколом. Я использовал PHP_SELF вместо REQUEST_URI, поскольку dirname('/do/') дает '/' (или '\') в Windows, когда вы хотите вернуть '/do/'.

if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'off') {
    $protocol = 'http://';
} else {
    $protocol = 'https://';
}
$base_url = $protocol . $_SERVER['SERVER_NAME'] . dirname($_SERVER['PHP_SELF']);

Ответ 5

Я предлагаю не использовать dirname(). У меня было несколько проблем с несколькими сокращениями и неожиданными результатами. Вот почему я создал currentdir():

function currentdir($url) {
    // note: anything without a scheme ("example.com", "example.com:80/", etc.) is a folder
    // remove query (protection against "?url=http://example.com/")
    if ($first_query = strpos($url, '?')) $url = substr($url, 0, $first_query);
    // remove fragment (protection against "#http://example.com/")
    if ($first_fragment = strpos($url, '#')) $url = substr($url, 0, $first_fragment);
    // folder only
    $last_slash = strrpos($url, '/');
    if (!$last_slash) {
        return '/';
    }
    // add ending slash to "http://example.com"
    if (($first_colon = strpos($url, '://')) !== false && $first_colon + 2 == $last_slash) {
        return $url . '/';
    }
    return substr($url, 0, $last_slash + 1);
}

Почему вы не должны использовать dirname()

Предположим, что у вас image.jpg находится в images/, и у вас есть следующий код:

<img src="<?php echo $url; ?>../image.jpg" />

Теперь предположим, что $url может содержать разные значения:

  • http://example.com/index.php
  • http://example.com/images/
  • http://example.com/images//
  • http://example.com/
  • и др.

Независимо от того, что он содержит, нам нужен текущий каталог для создания рабочего deeplink. Вы пытаетесь выполнить dirname() и сталкиваетесь со следующими проблемами:

1.) Различные результаты для файлов и каталогов

Файл
dirname('http://example.com/images/index.php') возвращает http://example.com/images

Каталог
dirname('http://example.com/images/') возвращает http://example.com

Но не проблема. Мы могли бы обмануть это с помощью трюка:
dirname('http://example.com/images/' . '&') . '/' возвращает http://example.com/images/

Теперь dirname() возвращает в обоих случаях необходимый текущий каталог. Но у нас будут другие проблемы:

2.) Некоторые множественные сокращения будут удалены
dirname('http://example.com//images//index.php') возвращает http://example.com//images

Конечно, этот URL-адрес не очень хорошо сформирован, но происходят множественные сокращения, и нам нужно действовать как браузеры, поскольку веб-мастера используют их для проверки их вывода. И, может быть, вам интересно, но все три изображения следующего примера загружены.

<img src="http://example.com/images//../image.jpg" />
<img src="http://example.com/images//image.jpg" />
<img src="http://example.com/images/image.jpg" />
<img src="http://example.com/images/../image.jpg" />

Вот почему вы должны держать несколько слэшей. Поскольку dirname() удаляет только несколько слэшей, я открыл биг-код.

3.) Корневой URL-адрес не возвращает корневой каталог
dirname('http://example.com') возвращает http:
dirname('http://example.com/') возвращает http:

4.) Корневой каталог возвращает относительный путь
dirname('foo/bar') возвращает .

Я ожидал бы /.

5.) Неправильно закодированные URL
dirname('foo/bar?url=http://example.com') возвращает foo/bar?url=http:

Все результаты теста:
http://www.programmierer-forum.de/aktuelles-verzeichnis-alternative-zu-dirname-t350590.htm#4329444

Ответ 6

Если вы хотите включить имя сервера, как я понял, то следующие фрагменты кода должны делать то, что вы просите:

$result = $_SERVER['SERVER_NAME'] . dirname(__FILE__);

$result = $_SERVER['SERVER_NAME'] . __DIR__; // PHP 5.3

$result = $_SERVER['SERVER_NAME'] . '/' . dirname($_SERVER['REQUEST_URI']);

Ответ 7

dirname предоставит вам часть каталога пути к файлу. Например:

echo dirname('/path/to/file.txt');  // Outputs "/path/to"

Получение URL-адреса текущего script немного сложнее, но $_SERVER['REQUEST_URI'] вернет вам часть после имени домена (т.е. даст вам "/do/index.php" ).

Ответ 8

лучший способ - использовать функцию explode/implode (встроенный PHP), например,

$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$parts = explode('/',$actual_link);
$parts[count($parts) - 1] = "";
$actual_link = implode('/',$parts);
echo $actual_link;

Ответ 9

Мое предложение:

const DELIMITER_URL = '/';
$urlTop = explode(DELIMITER_URL, trim(input_filter(INPUT_SERVER,'REQUEST_URI'), DELIMITER_URL))[0]

Тест:

const DELIMITER_URL = '/';
$testURL = "/top-dir";
var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]);

$testURL = "/top-dir/";
var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]);

$testURL = "/top-dir/test";
var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]);

$testURL = "/top-dir/test/";
var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]);

$testURL = "/top-dir/test/this.html";
var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]);

$testURL = "/top-dir/test.html";
var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]);

Выход теста:

string(7) "top-dir"
string(7) "top-dir"
string(7) "top-dir"
string(7) "top-dir"
string(7) "top-dir"
string(7) "top-dir"

Ответ 10

Более короткое (и правильное) решение, которое сохраняет косую черту:

$url = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$url_dir = preg_replace('/[^\/]+\.php(\?.*)?$/i', '', $url);
echo $url_dir;

Ответ 11

Мой вклад
Проверено и работает

/**
* Get Directory URL
*/
function get_directory_url($file = null) {
    $protocolizedURL = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $trailingslashURL= preg_replace('/[^\/]+\.php(\?.*)?$/i', '', $protocolizedURL);
    return $trailingslashURL.str_replace($_SERVER['DOCUMENT_ROOT'], '', $file);
}

ИСПОЛЬЗОВАНИЕ
Пример 1:
  <?php echo get_directory_ur('images/monkey.png'); ?>
Это вернет http://localhost/go/images/monkey.png

Пример 2:
<?php echo get_directory_ur(); ?>
Это вернет http://localhost/go/