Это url моего script: localhost/do/index.php
Мне нужна переменная или функция, которая возвращает localhost/do
(что-то вроде $_SERVER['SERVER_NAME'].'/do'
)
Это url моего script: localhost/do/index.php
Мне нужна переменная или функция, которая возвращает localhost/do
(что-то вроде $_SERVER['SERVER_NAME'].'/do'
)
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/
$_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/
Когда я выполнял некоторые из этих ответов, я столкнулся с несколькими проблемами, поскольку я использую 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']);
Я предлагаю не использовать 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
Если вы хотите включить имя сервера, как я понял, то следующие фрагменты кода должны делать то, что вы просите:
$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-адреса текущего script немного сложнее, но $_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"
Более короткое (и правильное) решение, которое сохраняет косую черту:
$url = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$url_dir = preg_replace('/[^\/]+\.php(\?.*)?$/i', '', $url);
echo $url_dir;
Мой вклад
Проверено и работает
/**
* 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/