Это URL моего скрипта: localhost/do/index.php
Я хочу переменную или функцию, которая возвращает localhost/do
(что-то вроде $_SERVER['SERVER_NAME'].'/do'
)
Пытаться:
$url = $_SERVER['REQUEST_URI']; //returns the current URL $parts = explode('/',$url); print_r($parts);
РЕДАКТИРОВАТЬ:
$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/
$_SERVER['SERVER_NAME'] . dirname($_SERVER['REQUEST_URI']);
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/
Я предлагаю не использовать 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/' . '&') . '/'
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
Когда я выполнял некоторые из этих ответов, я столкнулся с несколькими проблемами, поскольку я использую IIS, и мне также нужен полный URL-адрес с протоколом. Я использовал PHP_SELF
вместо REQUEST_URI
как dirname('/do/')
PHP_SELF
'/'
(или '\'
) в Windows, когда вы хотите вернуть '/do/'
.
if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'off') { $protocol = 'http://'; } else { $protocol = 'https://'; } $base_url = $protocol . $_SERVER['SERVER_NAME'] . dirname($_SERVER['PHP_SELF']);
Если вы хотите включить имя сервера, как я понял, то следующие фрагменты кода должны делать то, что вы просите:
$result = $_SERVER['SERVER_NAME'] . dirname(__FILE__); $result = $_SERVER['SERVER_NAME'] . __DIR__; // PHP 5.3 $result = $_SERVER['SERVER_NAME'] . '/' . dirname($_SERVER['REQUEST_URI']);
dirname
предоставит вам часть каталога пути к файлу. Например:
echo dirname('/path/to/file.txt'); // Outputs "/path/to"
Получение URL-адреса текущего скрипта немного сложнее, но $_SERVER['REQUEST_URI']
вернет вам часть после имени домена (т. Е. Даст вам «/do/index.php»).
лучший способ – использовать функцию 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;
Мое предложение:
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"