php include абсолютный путь

Абсолютные и относительные пути в 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-адресами тоже:

Также мы можем указать ссылку на текущий каталог, что бывает актуально в некоторых операционных системах:

Источник

Как включить PHP-файлы, требующие абсолютного пути?

у меня есть структура каталогов, как следующее:

inc / include1.в PHP
inc / include2.в PHP

объекты / object1.в PHP
objects / object2.в PHP

11 ответов

Это должно работать

Edit: добавлено imporvement by aussieviking

полный путь и имя файл. Если используется внутри include, возвращается имя включенного файла. Начиная с PHP 4.0.2, __FILE__ всегда содержит абсолютный путь с символические ссылки разрешены, тогда как в более старых относительный путь (его варианты) при некоторых обстоятельствах. (источник)

вы можете определить константу с путем к корневому каталогу вашего проекта, а затем поместить ее в начале пути.

пока вы устанавливаете переменные include_path соответственно, вам больше не нужно включать файл класса.

Я нашел, что это очень хорошо!

Я думаю, что лучший способ-поместить ваши includes в ваш PHP include path. Существуют различные способы сделать это в зависимости от вашей установки.

затем вы можете просто обратиться к

изнутри любого файла, независимо от того, где он находится: в ваших includes или в ваших доступных в интернете файлах или на любом уровне вложенных подкаталогов.

Это позволяет вам иметь включенные файлы вне корня веб-сервера, что является лучшей практикой.

кроме того, проверьте __autoload для ленивой загрузки файлов классов

я использую эту строку кода. Он возвращается к «вершине» дерева сайта, затем переходит к нужному файлу.

например, предположим, у меня есть это дерево файлов:

domain.com/aaa/index.php
domain.com/bbb/ccc/ddd/index.php
domain.com/_resources/functions.php

Я могу включить функции.php-файл, где бы я ни был, просто скопируйте вставку

Если вам нужно использовать этот код много раз, вы можете создать функцию, которая возвращает str_repeat(‘../’,(substr_count(getenv(‘SCRIPT_URL’),’/’)-1)) часть. Затем просто вставьте эту функцию в первый файл, который вы включаете. У меня есть «инициализировать».php » файл, который я включаю в самом верху каждой страницы php и который содержит эту функцию. В следующий раз, когда я должен включить файлы, я на самом деле просто использую функцию (с именем path_back ):

@Flubba, позволяет ли это мне иметь папки внутри моего каталога include? плоские каталоги include дают мне кошмары. поскольку весь каталог объектов должен находиться в каталоге inc.

О да, абсолютно. Так, например, мы используем один слой вложенных папок, как правило:

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

так, например, если вы делаете MVC, вы бы поместили путь к вашему приложению directoy в Include path, а затем указали ссылку на вещи в форме

но вообще говоря, он просто позволяет работать с очень короткими путями в вашем PHP, которые будут работать из любого места и это намного проще для чтения, чем весь этот документ realpath root malarkey.

преимущество этих сценариев на основе альтернатив, которые другие предложили, они работают в любом месте, даже на общих коробках; установка пути включения требует немного больше мыслей и усилий, но, как я уже упоминал, позволяет начать использовать __autoload, который просто самый крутой.

Если вы собираетесь включить определенный путь в большинство файлов в приложении, создайте глобальную переменную в корневой папке.

теперь эта глобальная переменная»APPLICATION_PATH » можно использовать для включения всех файлов вместо вызова realpath () каждый раз, когда вы включаете новый файл.

Источник

Подключение файлов в PHP

В PHP есть поддержка вызова одного сценария из другого. С помощью специальной конструкции языка можно вызвать сценарий из отдельного файла по его имени, также как по имени вызываются функции. Такая способность называется подключением файлов. Причём таковым файлом может являться как php-сценарий, так и любой другой текстовый файл. Например, HTML-страница.

Зачем разделять и подключать php-сценарии

PHP-разработчики дробят весь исходный код проекта на отдельные сценарии, чтобы с ними проще было работать. Если бы пришлось писать весь код в одном файле, то такой сценарий стал бы просто необъятным и ориентироваться там стало решительно невозможно. Поэтому разделение кода на разные сценарии — это естественный способ бороться со сложностью.
Есть и ещё один положительный эффект от подобного деления. Если вынести повторяющиеся блоки кода в отдельные сценарии, то появится возможность повторно использовать один код в разных файлах и подключать его только по требованию. Хороший пример — это пользовательские функции. Очень удобно объявлять их в отдельном сценарии, а затем подключать там, где эти функции понадобятся.

Способы подключения файлов

Примеры подключения файлов

Содержимое файла sub.php :

В файле index.php находится код, который подключит сценарий sub.php :

Интересный факт: require можно использовать как ключевое слово, либо как функцию.
Результат будет одним и тем же:

Результат работы:

Абсолютные и относительные пути

При подключении файла в качестве его адреса можно указывать абсолютный или относительный путь.

Абсолютный путь включает в себя полный адрес файла от корня диска.
Пример: /var/www/web/site/inc/sub.php

Полезные константы

В PHP есть полезные встроенные константы, которые пригодятся для использования в пути к подключаемым файла.

__DIR__ — Полный путь к директории, в которой находится текущий сценарий
__FILE__ — Полный путь к текущему сценарию

Видимость переменных в подключаемых сценариях

Источник

Как установить абсолютный путь include в PHP?

В HTML я могу найти файл, начиная с корневой папки веб-сервера, начав путь к файлу с помощью «/». Как:

Я могу поместить этот путь в любой файл в любой подкаталог, и он укажет на правильное изображение.

С PHP я пробовал нечто подобное:

. но это не работает.

Я думаю, что эта страница говорит, что я могу установить include_path один раз и после этого, это будет принято. Но я не совсем понимаю синтаксис. Оба примера начинаются с периода, и он говорит:

Использование. в include-пути допускает относительное включение, поскольку это означает текущий каталог.

Разъяснение

Мои файлы разработки в настоящее время обслуживаются XAMPP/Apache. Это влияет на абсолютный путь? (Я еще не уверен, что будет сервер производства.)

Update

Я не знаю, что моя проблема была здесь. include_path вещь, на которую я ссылался выше, была именно тем, что я искал, и синтаксис на самом деле не запутан. Я просто попробовал, и он отлично работает.

В любом случае проблема решена!:)

ОТВЕТЫ

Ответ 1

Затем во всех файлах я знаю, что является корнем моего проекта и может делать такие вещи, как это

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

Ответ 2

Одна стратегия

Я не знаю, лучший ли это, но это сработало для меня.

Ответ 3

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

Ответ 4

В include/require нет ничего, что мешало бы вам использовать абсолютный путь. так твой пример

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

Однако такое поведение считается потенциальной угрозой безопасности. Поэтому системный администратор может установить директиву open_basedir.

Эта директива определяет, откуда вы можете включать/запрашивать ваши файлы, и это может быть вашей проблемой.
Некоторые панели управления (например, plesk) по умолчанию задают эту директиву так же, как корень документа.

что касается ‘.’ синтаксис:

Тем не менее, я обычно использую немного другой вариант:

Ответ 5

создайте файл (т.е. my_paths.php ), содержащий этот

Теперь вам нужно всего лишь включить в каждый файл в папке MyProyect этот файл ( my_paths.php ), так что вы можете использовать MY_ABS_PATH как абсолютный путь для MyProject.

Ответ 6

Непосредственно отвечать на ваш вопрос, но что-то помнить:

Когда вы используете include с allow_url_include в своем ini, будьте уверены, что при доступе к сеансам из включенных файлов, если из script вы включаете один файл, используя абсолютную ссылку на файл, а затем включаете второй файл с локального сервера, используя Ссылка на файл url, что у них разная область видимости переменных, и тот же сеанс не будет отображаться из обоих включенных файлов. Исходный сеанс не будет отображаться из файла с включенным URL.

Ответ 7

getcwd() указывает на: /usr/srv/apache/htdocs/myworkingdir (в качестве примера)

хороший день strtok

Ответ 8

Я следую примеру WordPress на этом. Я иду и определяю корневой путь, как правило, корень документа, а затем отправляю определение пучка другого пути вместе с ним (по одному для каждого из моих классов. IE: база данных, пользователи, html и т.д.). Часто я определяю корневой путь вручную вместо того, чтобы полагаться на переменную сервера.

Пример

Ответ 9

таким образом, если в http//localhost/myapp/subfolder1/subfolder2/myfile.php я хотел включить файл из http//localhost/myapp

Мне нужно будет указать его как: включают в себя ( «C:\XAMPP\HTDOCS\MyApp\includeme.php» ) или включают в себя ( «../../includeme.php» )

И НЕ включают в себя ( «/MyApp/includeme.php» )

Ответ 10

Я придумал одну строку кода для установки в верхней части моего каждого php script, чтобы компенсировать:

Источник

Предупреждение безопасности

Удалённые файлы могут быть обработаны на удалённой стороне (в зависимости от расширения файла и того, что удалённый сервер выполняет скрипты PHP или нет), но это всё равно должно производить корректный скрипт PHP, потому что он будет затем обработан уже на локальном сервере. Если файл с удалённого сервера должен быть обработан и только отображён его результат, гораздо эффективно воспользоваться функцией readfile() В противном случае следует соблюдать особую осторожность, чтобы обезопасить удалённый скрипт для получения корректного и желаемого кода.

Смотрите также раздел Удалённые файлы, функции fopen() и file() для дополнительной информации.

Пример #4 Сравнение возвращаемого значения при include

// не сработает, интерпретируется как include((‘vars.php’) == TRUE), то есть include(‘1’)
if (include( ‘vars.php’ ) == TRUE ) <
echo ‘OK’ ;
>

// сработает
if ((include ‘vars.php’ ) == TRUE ) <
echo ‘OK’ ;
>
?>

Пример #5 Выражения include и return

?>

testreturns.php
= include ‘return.php’ ;

$bar = include ‘noreturn.php’ ;

Если во включаемом файле определены функции, они могут быть использованы в главном файле вне зависимости от того, были ли они объявлены до return или после. Если файл включается дважды, PHP выдаст фатальную ошибку, потому что функции уже были определены. Рекомендуется использовать include_once вместо того, чтобы проверять был ли файл уже включён.

Пример #6 Использование буферизации вывода для включения файла PHP в строку

Замечание: Поскольку это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций.

User Contributed Notes 21 notes

If you want to have include files, but do not want them to be accessible directly from the client side, please, please, for the love of keyboard, do not do this:

// check if what is defined and die if not

?>

The reason you should not do this is because there is a better option available. Move the includeFile(s) out of the document root of your project. So if the document root of your project is at «/usr/share/nginx/html», keep the include files in «/usr/share/nginx/src».

# index.php (in document root (/usr/share/nginx/html))

?>

Since user can’t type ‘your.site/../src/includeFile.php’, your includeFile(s) would not be accessible to the user directly.

Before using php’s include, require, include_once or require_once statements, you should learn more about Local File Inclusion (also known as LFI) and Remote File Inclusion (also known as RFI).

As example #3 points out, it is possible to include a php file from a remote server.

The LFI and RFI vulnerabilities occur when you use an input variable in the include statement without proper input validation. Suppose you have an example.php with code:

However, it opens up an RFI vulnerability. To exploit it as an attacker, I would first setup an evil text file with php code on my evil.com domain.

The example.php would download my evil.txt and process the operating system command that I passed in as the command variable. In this case, it is whoami. I ended the path variable with a %00, which is the null character. The original include statement in the example.php would ignore the rest of the line. It should tell me who the web server is running as.

Please use proper input validation if you use variables in an include statement.

dir1/test contains the following text :
This is test in dir1
dir2/test contains the following text:
This is test in dir2
dir1_test contains the following text:
This is dir1_test
dir2_test contains the following text:
This is dir2_test

As a rule of thumb, never include files using relative paths. To do this efficiently, you can define constants as follows:

and so on. This way, the files in your framework will only have to issue statements such as this:

If you’re running scripts from below your main web directory, put a prepend.php file in each subdirectory:

I would like to point out the difference in behavior in IIS/Windows and Apache/Unix (not sure about any others, but I would think that any server under Windows will be have the same as IIS/Windows and any server under Unix will behave the same as Apache/Unix) when it comes to path specified for included files.

Consider the following:
include ‘/Path/To/File.php’ ;
?>

In IIS/Windows, the file is looked for at the root of the virtual host (we’ll say C:\Server\Sites\MySite) since the path began with a forward slash. This behavior works in HTML under all platforms because browsers interpret the / as the root of the server.

However, Unix file/folder structuring is a little different. The / represents the root of the hard drive or current hard drive partition. In other words, it would basically be looking for root:/Path/To/File.php instead of serverRoot:/Path/To/File.php (which we’ll say is /usr/var/www/htdocs). Thusly, an error/warning would be thrown because the path doesn’t exist in the root path.

I just thought I’d mention that. It will definitely save some trouble for those users who work under Windows and transport their applications to an Unix-based server.

A work around would be something like:
= null ;

if ( defined ( ‘__DIR__’ )) <
$currentDirectory = __DIR__ ;
>
else <
$currentDirectory = dirname ( __FILE__ );
>

It’s worth noting that PHP provides an OS-context aware constant called DIRECTORY_SEPARATOR. If you use that instead of slashes in your directory paths your scripts will be correct whether you use *NIX or (shudder) Windows. (In a semi-related way, there is a smart end-of-line character, PHP_EOL)

Sometimes it will be usefull to include a string as a filename

Ideally includes should be kept outside of the web root. That’s not often possible though especially when distributing packaged applications where you don’t know the server environment your application will be running in. In those cases I use the following as the first line.

Be very careful with including files based on user inputed data. For instance, consider this code sample:

file_exists() will return true, your passwd file will be included and since it’s not php code it will be output directly to the browser.

Of course the same vulnerability exists if you are reading a file to display, as in a templating engine.

You absolutely have to sanitize any input string that will be used to access the filesystem, you can’t count on an absolute path or appended file extension to secure it. Better yet, know exactly what options you can accept and accept only those options.

If you are including a file from your own site, do not use a URL however easy or tempting that may be. If all of your PHP processes are tied up with the pages making the request, there are no processes available to serve the include. The original requests will sit there tying up all your resources and eventually time out.

Use file references wherever possible. This caused us a considerable amount of grief (Zend/IIS) before I tracked the problem down.

If you have a problem with «Permission denied» errors (or other permissions problems) when including files, check:

1) That the file you are trying to include has the appropriate «r» (read) permission set, and
2) That all the directories that are ancestors of the included file, but not of the script including the file, have the appropriate «x» (execute/search) permission set.

I would like to emphasize the danger of remote includes. For example:
Suppose, we have a server A with Linux and PHP 4.3.0 or greater installed which has the file index.php with the following code:

Then, we hava a server B, also Linux with PHP installed, that has the file list.php with the following code:

But here’s the trick: if Server B doesn’t have PHP installed, it returns the file list.php to Server A, and Server A executes that file. Now we have a file listing of Server A!
I tried this on three different servers, and it allways worked.
This is only an example, but there have been hacks uploading files to servers etc.

So, allways be extremely carefull with remote includes.

Just about any file type can be ‘included’ or ‘required’. By sending appropriate headers, like in the below example, the client would normally see the output in their browser as an image or other intended mime type.

You can also embed text in the output, like in the example below. But an image is still an image to the client’s machine. The client must open the downloaded file as plain/text to see what you embedded.

( ‘Content-type: image/jpeg’ );
header ( ‘Content-Disposition: inline;’ );

include ‘/some_image.jpg’ ;
echo ‘This file was provided by example@user.com.’ ;

‘Including’ any file made this way will execute those scripts. NEVER ‘include’ anything that you found on the web or that users upload or can alter in any way. Instead, use something a little safer to display the found file, like «echo file_get_contents(‘/some_image.jpg’);»

To Windows coders, if you are upgrading from 5.3 to 5.4 or even 5.5; if you have have coded a path in your require or include you will have to be careful. Your code might not be backward compatible. To be more specific; the code escape for ESC, which is «\e» was introduced in php 5.4.4 + but if you use 5.4.3 you should be fine. For instance:

Test script:
————-
require( «C:\element\scripts\include.php» );
?>

In php 5.3.* to php 5.4.3
—————————-
If you use require(«C:\element\scripts\include.php») it will work fine.

If php 5.4.4 + It will break.
——————————
Warning: require(C:←lement\scripts\include.php): failed to open stream: In
valid argument in C:\element\scripts\include.php on line 20

Fatal error: require(): Failed opening required ‘C:←lement\scripts\include.php

I hope this makes sense and I hope it will someone sometime down the road.
cheers,

// used like
include_all_once ( ‘dir/*.php’ );

?>
A fairly obvious solution. It doesn’t deal with relative file paths though; you still have to do that yourself.

Notice that using @include (instead of include without @) will set the local value of error_reporting to 0 inside the included script.

echo «Own value before: » ;
echo ini_get ( ‘error_reporting’ );
echo «\r\n» ;

echo «include foo.php: » ;
include( ‘foo.php’ );

echo «@include foo.php: » ;
@include( ‘foo.php’ );

While you can return a value from an included file, and receive the value as you would expect, you do not seem to be able to return a reference in any way (except in array, references are always preserved in arrays).

i.e the reference passed to x() is broken on it’s way out of the include()

The only solutions are to set a variable with the reference which the including code can then return itself, or return an array with the reference inside.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *