PHP получить URL-адрес текущей файловой директории
Это может быть простой вопрос для вас, но я ломаю голову над этим.
У меня есть php-файл, который должен знать, что это URL текущей директории, чтобы иметь возможность ссылаться на что-то относительно себя.
Например, в настоящее время я знаю, чтобы получить текущий путь к каталогу вместо URL. Когда я использую это, я получаю путь:
Но это был бы мой желаемый результат:
Обратите внимание, что это не местоположение текущей страницы. Страница вызывает файл изHTTP: // локальный: 8888 / dir1 / dir2 / dir3 / myfile.php «И у» myfile.php «есть скрипт сверху.
— редактировать, чтобы разработать более подробную информацию —
Спасибо за ваши ответы. Но я понимаю, что мне нужно добавить больше деталей.
Решение
Например, если URL http://localhost/
Этого достаточно, чтобы создать относительный URL.
Если вы хотите каталог, в котором работает текущий скрипт — без имени файла — использовать:
В приведенном выше случае это даст вам /
Обратите внимание, что echo getcwd(); является не что вы хотите, исходя из вашего вопроса. Это дает вам местоположение в файловой системе / сервере (не URL), с которого запускается ваш скрипт. Каталог, в котором находится скрипт на файловой системе сервера, и URL — это две совершенно разные вещи.
Есть также функция для разбора URL, встроенная в PHP: http://php.net/manual/en/function.parse-url.php
Другие решения
Если ваш URL такой: https://localhost.com/this/is/a/url
$_SERVER[‘DOCUMENT_ROOT’] — дает системный путь [/ Вар / WWW / HTML / это / есть / а / URL]
$_SERVER[‘PHP_SELF’] — дает маршрут текущего файла (после имени домена) [/ Это / есть / а / URL]
$_SERVER[‘SERVER_NAME’] — дает доменное имя [Localhost.com]
$_SERVER[‘HTTP_REFERER’] — дает правильный протокол HTTP (S) и имя домена. [https://localhost.com]
Если вы хотите получить полный URL, вы можете сделать что-то вроде:
Исходя из вашего вопроса, я верю, что вы получите то, что хотите:
Ссылка:
С добавленным substr() а также strrpos() методы, вы можете убрать _myfile.php` из конца, чтобы получить желаемый результат:
HTTP: // локальный: 8888 / dir1 / dir2 / dir3
Вот код, который я сейчас буду использовать:
Каталоги
Получение файлов из каталога
Сначала рассмотрим современный способ получения файлов. Он появился в версии PHP 5. Функция scandir() возвращает массив, содержащий имена каталогов и файлов в указанном каталоге.
scandir (адрес, сортировка, контекст)
Указанные константы для сортировки появились, начиная с версии PHP 5.4.0. В предыдущих версиях сортировка указывалась по другому. Любое значение, отличное от нулевого, определяет сортировку по убыванию, а 0 сортировку по возрастанию.
В массиве, который возвращает функция, кроме имён файлов и директорий, всегда есть два значения: «.» и «..». Одна точка означает текущий каталог, а две точки означают родительский каталог.
Для примера создадим в папке со скриптами папку с именем mydirectory. Скопируем в неё несколько файлов. Выведем на страницу список файлов из директории.
Выбор каталога
Часто возникает необходимоть работать с текущим каталогом, то есть с тем, в котором находится скрипт. Для выбора этого каталога не обязательно указывать абсолютный адрес. Можно указать по-другому. Одна точка означает текущую директорию, а две точки означают родительскую директорию. Пример:
Функция getcwd() возвращает адрес текущей директории.
Создание, перемещение и удаление каталога
Функция mkdir() создаёт новый каталог. Возвращает true в случае успеха.
mkdir (адрес, режим доступа, вложенные каталоги, контекст)
Обязателен только первый параметр.
Создадим в текущем каталоге новый каталог. Учитывайте, что в 6 строке текущим был выбран другой каталог.
Функция rmdir() удаляет каталог. При этом он должен быть пустым. Если он не пустой, то сначала нужно переместить или удалить из него все файлы. Функция возвращает true при успешном удалении.
Коприрование материалов сайта возможно только с согласия администрации
Абсолютные и относительные пути в PHP
Чем отличаются пути в PHP и URL
Когда мы смотрим любимый фильм или сериал, мы видим только готовый продукт.
А за кадром существует совсем другой, невидимый для нас мир: стилисты и гримёры, искусственные декорации, наложение спецэффектов и многое другое.
Вполне вероятно, что и такой папки там тоже нет, а все URL адреса обрабатываются одним единственным PHP файлом.
Новички часто путают пути к реальным файлам с URL адресами. Сейчас я разберу пару таких ошибок, на примере которых можно будет прочувствовать разницу.
Ошибка №1: Подстановка физического пути в URL
Это неправильно. Браузер не может видеть реальную файловую структуру сервера. Он не видит никаких дисков D, он видит только URL адреса.
Правильная ссылка выглядит так (разницу объясню чуть позже):
Ошибка №2: Подключение скриптов по URL
Иногда новички пытаются подключить физический файл по его URL:
Это неправильно. Во-первых, подключится не сам скрипт, а результат его работы. Во-вторых, подключать какие-то файлы через URL вообще идея очень опасная.
Абсолютный путь в PHP
Как видите, это полный путь от корня диска до конкретного файла или папки. Начинается со слеша или буквы диска (Windows).
Получить абсолютный путь скрипта можно с помощью магической константы __FILE__ :
Для получения абсолютного пути к папке, в которой находится скрипт, есть магическая константа __DIR__ :
Как этим пользоваться. Допустим, у нас в корне сайта лежат файлы index.php и config.php и мы хотим подключить второй в первый.
Если мы хотим подключить config.php по его абсолютному пути, есть два способа сделать это:
Поскольку константа __DIR__ не добавляет слеш после последней папки, мы указываем его вручную.
Относительный путь в PHP
Далее PHP попытается найти файл в папке текущего рабочего каталога.
Например, если мы в index.php подключили файл scripts/script.php, а в этом самом script.php уже пытаемся подключить файл по относительному пути, тогда поиск файла произойдёт и в папке scripts тоже.
Именно по этой причине я призываю тебя отказаться от использования относительных путей в PHP.
Кому-то из практикующих разработчиков эта фраза может не понравиться, но я считаю это единственным разумным решением.
Тем более нет ничего сложного в добавлении константы __DIR__ перед именем скрипта, что автоматически сделает путь абсолютным.
Абсолютный путь в URL
Второй и третий варианты удобны тем, что при миграции с http на https и обратно все ссылки автоматически сменят протокол, не нужно будет бегать по всему сайту и менять вручную.
Лично я практически всегда использую третий вариант, кроме случаев, когда нужно указать ссылку на другой поддомен (blog.site.ru, shop.site.ru и т.д.).
Относительный путь в URL
Относительные пути в URL указываются без слеша в начале ссылки, например:
Относительные пути в URL более предсказуемы, чем в PHP. Но я рекомендую использовать их только там, где это действительно необходимо.
Чаще всего их использование приводит к путанице. И вот пара типичных проблем, с которыми часто сталкиваются новички.
Ошибка №1: относительные пути к стилям, скриптам и другим файлам
Представим, что мы решили подключить стили к нашему сайту:
Разработчик указывает относительный URL style.css и видит, что всё работает. По крайней мере, на главной странице.
Ошибка №2: Рекурсия в ссылках
При использовании относительных путей есть риск случайно создать на сайте бесконечные ссылки. Вот один из таких способов:
Для работы данного кода должна быть настроена единая точка входа.
Текущий и родительский каталоги
Помимо указания конкретных папок, мы также можем добавить в путь указание «перейти на папку выше», например:
В коде выше мы подключим файл config.php, который находится не в текущей папке, а в родительской. С абсолютными путями это тоже работает:
И с URL-адресами тоже:
Также мы можем указать ссылку на текущий каталог, что бывает актуально в некоторых операционных системах:
dirname
(PHP 4, PHP 5, PHP 7, PHP 8)
dirname — Возвращает имя родительского каталога из указанного пути
Описание
Получив строку, содержащую путь к файлу или каталогу, данная функция возвратит родительский каталог данного пути на levels уровней вверх.
В Windows dirname() предполагает текущую установленную кодовую страницу, поэтому для того, чтобы видеть правильное имя каталога с путями многобайтовых символов, необходимо установить соответствующую кодовую страницу. Если path содержит символы, недопустимые для текущей кодовой страницы, поведение basename() не определено.
В других системах dirname() предполагает, что path закодирован в кодировке, совместимой с ASCII. В противном случае поведение функции не определено.
Список параметров
На платформах Windows в качестве разделителей имён директорий используются оба слеша (прямой / и обратный \ ). В других операционных системах разделителем служит прямой слеш ( / ).
На сколько уровней вложенности вверх необходимо пройти.
Должно быть целым числом больше 0.
Возвращаемые значения
Список изменений
Примеры
Пример #1 Пример использования функции dirname()
Результатом выполнения данного примера будет что-то подобное:
Смотрите также
User Contributed Notes 29 notes
To get the directory of current included file:
( __FILE__ );
?>
For example, if a script called ‘database.init.php’ which is included from anywhere on the filesystem wants to include the script ‘database.class.php’, which lays in the same directory, you can use:
Since the paths in the examples given only have two parts (e.g. «/etc/passwd») it is not obvious whether dirname returns the single path element of the parent directory or whether it returns the whole path up to and including the parent directory. From experimentation it appears to be the latter.
returns ‘/usr/local/magic’ and not just ‘magic’
Also it is not immediately obvious that dirname effectively returns the parent directory of the last item of the path regardless of whether the last item is a directory or a file. (i.e. one might think that if the path given was a directory then dirname would return the entire original path since that is a directory name.)
Further the presense of a directory separator at the end of the path does not necessarily indicate that last item of the path is a directory, and so
dirname(‘/usr/local/magic/bin/’); #note final ‘/’
would return the same result as in my example above.
In short this seems to be more of a string manipulation function that strips off the last non-null file or directory element off of a path string.
I ran into this when I wrote a site on a url with a path, www.somehost.com/client/somepage.php, where the code above works great, but then wanted to put it on a subdomain, client.somehost.com/somepage.php, where things started breaking.
The best solution would be to create a function that generates absolute URLs and use that throughout the site, but creating a safe_dirname function (and an htaccess rewrite to fix double-slashes just in case) fixed the issue for me:
Attention with this. Dirname likes to mess with the slashes.
On Windows, Apache:
File located locally in: F:\localhost\www\Shaz3e-ResponsiveFramework\S3-CMS\_source
Example 1: dirname($_SERVER[‘PHP_SELF’]); //output: /Shaz3e-ResponsiveFramework/S3-CMS/_source
Getting absolute path of the current script:
( __FILE__ )
?>
Getting webserver relative path of the current script.
( dirname ( __FILE__ ));
?>
If anyone has a better way, get to the constructive critisism!
You can use it to get parent directory:
. include a file relative to file path:
Inside of script.php I needed to know the name of the containing directory. For example, if my script was in ‘/var/www/htdocs/website/somedir/script.php’ i needed to know ‘somedir’ in a unified way.
The solution is:
= basename ( dirname ( __FILE__ ));
?>
Expanding on Anonymous’ comment, this is not necessarily correct. If the user is using a secure protocol, this URL is inaccurate. This will work properly:
A simple way to show the www path to a folder containing a file.
The same function but a bit improved, will use REQUEST_URI, if not available, will use PHP_SELF and if not available will use __FILE__, in this case, the function MUST be in the same file. It should work, both under Windows and *NIX.
The best way to get the absolute path of the folder of the currently parsed PHP script is:
?>
This will result in an absolute unix-style path which works ok also on PHP5 under Windows, where mixing ‘\’ and ‘/’ may give troubles.
[EDIT by danbrown AT php DOT net: Applied author-supplied fix from follow-up note.]
dirname can be used to create self referencing web scripts with the following one liner.
A key problem to hierarchical include trees is that PHP processes include paths relative to the original file, not the current including file.
In some situations (I can’t locate the dependencies) basename and dirname may return incorrect values if parsed string is in UTF-8.
Like, dirname(«glossary/задний-фокус») will return «glossary» and basename(«glossary/задний-фокус») will return «-фокус».
Most mkpath() function I saw listed here seem long and convoluted.
Here’s mine:
If you want to get the parent parent directory of your script, you can use this:
this little function gets the top level public directory
In my mvc based framework i make BASE_PATH and BASE_URL definitions like the following and both work well in the framework without problem.
BASE_PATH is for server side inclusions.
BASE_URL is for client side inclusions (scripts, css files, images etc.)
Code for write permissions check:
If you merely want to find out wether a certain file is located within or underneath a certain directory or not, e.g. for White List validation, the following function might be useful to you:
You can get best root path if you want to call a file from you project paths.
Make sure this define in your www/index.php
or the core file that inside www/ root.
?>
You can call any file any time without any problems
A nice «current directory» function.
function current_dir()
<
$path = dirname($_SERVER[PHP_SELF]);
$position = strrpos($path,’/’) + 1;
print substr($path,$position);
>
I find this usefull for a lot of stuff! You can maintain a modular site with dir names as modules names. At least I would like PHP guys to add this to the function list!
If there is anything out there like it, please tell me.
scandir
scandir — Получает список файлов и каталогов, расположенных по указанному пути
Описание
Список параметров
За описанием параметра context обратитесь к разделу Потоки данного руководства.
Возвращаемые значения
Примеры
Пример #1 Простой пример использования функции scandir()
Результатом выполнения данного примера будет что-то подобное:
Примечания
Смотрите также
User Contributed Notes 36 notes
Easy way to get rid of the dots that scandir() picks up in Linux environments:
Here is my 2 cents. I wanted to create an array of my directory structure recursively. I wanted to easely access data in a certain directory using foreach. I came up with the following:
How i solved problem with ‘.’ and ‘..’
I needed to find a way to get the full path of all files in the directory and all subdirectories of a directory.
Here’s my solution: Recursive functions!
Needed something that could return the contents of single or multiple directories, recursively or non-recursively,
for all files or specified file extensions that would be
accessible easily from any scope or script.
scandir() with regexp matching on file name and sorting options based on stat().
name file name
dev device number
ino inode number
mode inode protection mode
nlink number of links
uid userid of owner
gid groupid of owner
rdev device type, if inode device *
size size in bytes
atime time of last access (Unix timestamp)
mtime time of last modification (Unix timestamp)
ctime time of last inode change (Unix timestamp)
blksize blocksize of filesystem IO *
blocks number of blocks allocated
Scandir on steroids:
For when you want to filter your file list, or only want to list so many levels of subdirectories.



