Как определить текущий url сайта и директории исполняющего файла в php
Если вы программируете на php, то вам обязательно придется столкнуться с такими понятиями , как относительные и абсолютные ссылки, директории скриптов и т.п.
Начнем с простого, а именно определения текущей страницы сайта.
Сделать это можно с помощью элемента супермассива: $_SERVER[‘REQUEST_URI’]. Пример: echo $_SERVER[‘REQUEST_URI’]; — выдаст ссылку текущей страницы сразу после домена со всеми GET параметрами, если они есть.
При методах include или require в php появляется необходимость использовать либо относительные пути директорий, либо абсолютные. Первые задаются относительно папки исполняющего скрипта. Например, есть файл index.php в папке sait. Нам нужно инклудить файл msg.php, который находится в этой же папке — тогда мы будем использовать команду include(‘msg.php’); Если бы msg.php находился в папке выше, то include(‘../msg.php’);
Что касается абсолютных путей, то они должны идти от корневой папки сервера. Чтобы правильно подключить файл на include используйте следующую конструкцию:
Здесь $_SERVER[‘DOCUMENT_ROOT’] подключит путь от корневой папки сервера (например: /var/www/u010381422/data/www/вашсайт.ру), а /sait/msg.php — часть ссылки, которую мы можем доподключить вручную.
Если подключения от корневой директории нужно производить часто, то рекомендую использовать константу:
define(‘ROOT’, $_SERVER[‘DOCUMENT_ROOT’]);
include(ROOT.»/sait/msg.php»);
Константы __FILE__ и __DIR__ в php
__FILE__ Вы можете использовать полезную константу __FILE__ для определения полного пути от сервера к вашему исполняющему файлу с выводом его имени и расширением. Например, если в нашем примере мы напишем echo __FILE__; — то получим полный путь к файлу, от которого запущена эта команда: /var/www/u010381422/data/www/вашсайт.ру/sait/msg.php (естественно, у вас будет другой путь директории).
__DIR__ В отличие от __FILE__ константа __DIR__ показывает только директорию исполняющего файла без его имени. Например: echo __DIR__; (выведет: /var/www/u010381422/data/www/вашсайт.ру/sait)
Если подвести итог, то создайте любой php файл и разместить в нем код:
echo $_SERVER[‘REQUEST_URI’]; echo ‘
‘; //Текущая ссылка файла
echo __FILE__; echo ‘
‘; //Полный путь и имя текущего файла — /var/www/u010381422/data/www/вашсайт.ру/sait/msg.php
echo __DIR__; echo ‘
‘; //Директория файла (эквивалент: dirname(__FILE__) ) — /var/www/u010381422/data/www/вашсайт.ру/sait
?>
После запуска такого файла, вы увидите все параметры индивидуальные для вашего сервера.
Генерация URL-адресов
Laravel предлагает несколько функций, которые помогут вам в создании URL-адресов для вашего приложения. Эти помощники в первую очередь полезны при построении ссылок в ваших шаблонах и ответах API или при создании ответов-перенаправлений в другую часть вашего приложения.
Основы
Создание URL
Помощник url используется для генерации произвольных URL-адресов для вашего приложения. Сгенерированный URL-адрес будет автоматически использовать схему (HTTP или HTTPS) и хост из текущего запроса, обрабатываемого приложением:
$post = App\Models\Post::find(1); echo url("/posts/id>"); // http://example.com/posts/1
Доступ к текущему URL
Если не передан путь помощнику url , то возвращается экземпляр Illuminate\Routing\UrlGenerator , позволяющий вам получить доступ к информации о текущем URL:
// Получить текущий URL без строки запроса . echo url()->current(); // Получить текущий URL, включая строку запроса . echo url()->full(); // Получить полный URL-адрес предыдущего запроса . echo url()->previous();
К каждому из этих методов также можно получить доступ через фасад URL :
use Illuminate\Support\Facades\URL; echo URL::current();
URL для именованных маршрутов
Помощник route используется для генерации URL-адресов для именованных маршрутов. Именованные маршруты позволяют создавать URL-адреса без привязки к фактическому URL-адресу, определенному в маршруте. Следовательно, если URL-адрес маршрута изменится, никаких изменений в ваши вызовы функции route вносить не нужно. Например, представьте, что ваше приложение содержит маршрут, определенный следующим образом:
Route::get('/post/', function (Post $post) < // >)->name('post.show');
Чтобы сгенерировать URL-адрес этого маршрута, вы можете использовать помощник route следующим образом:
echo route('post.show', ['post' => 1]); // http://example.com/post/1
Конечно, помощник route также может использоваться для генерации URL-адресов для маршрутов с несколькими параметрами:
Route::get('/post//comment/', function (Post $post, Comment $comment) < // >)->name('comment.show'); echo route('comment.show', ['post' => 1, 'comment' => 3]); // http://example.com/post/1/comment/3
Любые дополнительные элементы массива, не соответствующие параметрам определения маршрута, будут добавлены в строку запроса URL:
echo route('post.show', ['post' => 1, 'search' => 'rocket']); // http://example.com/post/1?search=rocket
Модели Eloquent
Вы часто будете генерировать URL-адреса, используя ключ маршрута (обычно первичный ключ) модели Eloquent. По этой причине вы можете передавать модели Eloquent в качестве значений параметров. Помощник route автоматически извлечет ключ маршрута модели:
echo route('post.show', ['post' => $post]);
Подписанные URL
Laravel позволяет вам легко создавать «подписанные» URL-адреса для именованных маршрутов. Эти URL-адреса имеют хеш «подписи», добавленный к строке запроса, который позволяет Laravel проверять, что URL-адрес не был изменен с момента его создания. Подписанные URL-адреса особенно полезны для маршрутов, которые общедоступны, но требуют уровня защиты от манипуляций с URL-адресами.
Например, вы можете использовать подписанные URL-адреса для реализации общедоступной ссылки «отказаться от подписки», которая отправляется вашим клиентам по электронной почте. Чтобы создать подписанный URL для именованного маршрута, используйте метод signedRoute фасада URL :
use Illuminate\Support\Facades\URL; return URL::signedRoute('unsubscribe', ['user' => 1]);
Если вы хотите сгенерировать временный подписанный URL-адрес маршрута, срок действия которого истекает по истечении определенного времени, вы можете использовать метод temporarySignedRoute . Когда Laravel проверяет временный подписанный URL-адрес маршрута, он гарантирует, что метка времени истечения срока, закодированная в подписанный URL-адрес, не истекла:
use Illuminate\Support\Facades\URL; return URL::temporarySignedRoute( 'unsubscribe', now()->addMinutes(30), ['user' => 1] );
Проверка запросов подписанного маршрута
Чтобы убедиться, что входящий запрос имеет действительную подпись, вы должны вызвать метод hasValidSignature для входящего запроса Request :
use Illuminate\Http\Request; Route::get('/unsubscribe/', function (Request $request) < if (! $request->hasValidSignature()) < abort(401); > // . >)->name('unsubscribe');
В качестве альтернативы, вы можете назначить маршруту посредник Illuminate\Routing\Middleware\ValidateSignature . Если его еще нет, вы должны назначить этому посреднику ключ в массиве routeMiddleware в HTTP-ядре:
/** * Посредники маршрутов приложения. * * Эти посредники могут быть групповыми или использоваться по отдельности. * * @var array */ protected $routeMiddleware = [ 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, ];
После того как вы зарегистрировали посредников в ядре приложения, вы можете назначить его маршруту. Если входящий запрос не имеет действительной подписи, посредник автоматически вернет HTTP-ответ 403 :
Route::post('/unsubscribe/', function (Request $request) < // . >)->name('unsubscribe')->middleware('signed');
Ответ на недействительные подписанные маршруты
Когда кто-то посещает подписанный URL-адрес, срок действия которого истек, он получит общую страницу с ошибкой для кода состояния 403 HTTP. Однако вы можете настроить это поведение, определив пользовательское «отображаемое» замыкание для исключения InvalidSignatureException в обработчике исключений. Это замыкание должно вернуть HTTP-ответ:
use Illuminate\Routing\Exceptions\InvalidSignatureException; /** * Зарегистрируйте обратные вызовы обработки исключений для приложения. * * @return void */ public function register() < $this->renderable(function (InvalidSignatureException $e) < return response()->view('error.link-expired', [], 403); >); >
URL для действий контроллера
Функция action генерирует URL-адрес для переданного действия контроллера:
use App\Http\Controllers\HomeController; $url = action([HomeController::class, 'index']);
Если метод контроллера принимает параметры маршрута, вы можете передать ассоциативный массив параметров маршрута в качестве второго аргумента функции:
$url = action([UserController::class, 'profile'], ['id' => 1]);
Значения по умолчанию
Для некоторых приложений вы можете указать значения по умолчанию для определенных параметров URL-адреса. Например, представьте, что многие из ваших маршрутов определяют параметр :
Route::get('//posts', function () < // >)->name('post.index');
Обременительно передавать locale каждый раз при вызове помощника route . Итак, вы можете использовать метод URL::defaults , чтобы определить значение по умолчанию для этого параметра, которое всегда будет применяться во время текущего запроса. Вы можете вызвать этот метод из посредника маршрута, чтобы получить доступ к текущему запросу:
namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\URL; class SetDefaultLocaleForUrls < /** * Обработка входящего запроса. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return \Illuminate\Http\Response */ public function handle($request, Closure $next) < URL::defaults(['locale' => $request->user()->locale]); return $next($request); > >
После установки значения по умолчанию для параметра locale вам больше не потребуется передавать его значение при генерации URL-адресов с помощью помощника route .
Параметры URL по умолчанию и приоритет посредника
Установка значений URL по умолчанию может мешать Laravel обрабатывать неявные привязки модели. Следовательно, необходимо установить приоритет посреднику, который задает значения URL по умолчанию, и должен выполняться перед посредником Laravel SubstituteBindings . Вы можете добиться этого, убедившись, что ваш посредник находится перед посредником SubstituteBindings в свойстве $middlewarePriority HTTP-ядра вашего приложения.
Свойство $middlewarePriority определено в базовом классе Illuminate\Foundation\Http\Kernel . Вы можете скопировать его определение из этого класса и перезаписать его в HTTP-ядре вашего приложения, чтобы изменить приоритет:
/** * Список посредников, отсортированный по приоритетности. * * Заставит неглобальных посредников всегда быть в заданном порядке. * * @var array */ protected $middlewarePriority = [ // . \App\Http\Middleware\SetDefaultLocaleForUrls::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, // . ];
Русскоязычное комьюнити
- Группа в VK
- Телеграм LaravelRUS
- Телеграм Laravel для новичков
- Телеграм LaravelPro
Обучающие ресурсы
- Laracasts
- Codecourse
- Курс Дмитрия Елисеева
- Adam Wathan
Блоги разработчиков
- Laravel News
- Freek Van der Herten
- Brent Roose
- Marcel Pociot
Как получить текущий url страницы php
Обновите страницу что бы увидеть другие модули
Бесплатно
Наличие партнёрской системы гарантирует хороший маркетинг, т.к магазин сможет иметь собственных парт..
Как получить контент сайта на PHP
Парсер контента на языке PHP – это важный инструмент для веб-разработчиков, которые работают с различными источниками данных. Он позволяет извлекать нужную информацию из HTML-страниц, XML-файлов и других форматов, а также обрабатывать ее в соответствии с заданными правилами.
Одним из основных преимуществ парсера контента является возможность автоматизировать процесс получения и обработки данных, что позволяет сократить время выполнения задач и уменьшить вероятность ошибок.
Для получения контента определённой страницы сайта есть простое решение с помощью собственной функции php — file_get_contents . Всё, что требуется это передать в функцию URL нужной страницы.
Получение контента с помощью библиотеки SimpleHTMLDOM
Для более качественной работы функции лучше воспользоваться подключаемой библиотекой SimpleHTMLDOM. В simplehtmldom есть методы для удаленной загрузки страниц. После подключения файла библиотеки, нам доступны 2 функции для обработки HTML строк:
str_get_html(str) и file_get_html(url)
Они делают одно и тоже, преобразуют HTML текст в DOM дерево, различаются лишь источники.
str_get_htm – на вход получает обычную строку, т.е. если вы получили HTML прибегнув к curl, или file_get_contents то вы просто передаете полученный текст этой функции.
$html = str_get_html(‘html код’);
file_get_html – сама умеет загружать данные с удаленного URL или из локального файла
К сожалению, file_get_html загружает страницы обычным file_get_contents . Это значит если хостер, выставил в php.ini allow_url_fopen = false (т.е. запретил удаленно открывать файлы), то загрузить что-то удаленно, не получится. Да и серьезные веб сайты таким способом парсить не стоит, лучше использовать CURL с поддержкой proxy и ssl .
$html = file_get_html(‘http://www.yandex.ru/’);
в результате, в переменной $html будет объект типа simple_html_dom.
При больших объемах данных, в библиотеке происходит утечка памяти. Поэтому после окончания одного цикла надо ее чистить.
Делает это метод clear .
К примеру грузим 5 раз сайт www.yandex.ru с разными поисковыми запросами
include 'simple_html_dom.php'; $k = 5; while($k>0)< $html = file_get_html('http://yandex.ru/yandsearch?text=hi'.$k.'&lr=11114'); // загружаем данные // как-то их обрабатываем $html->clear(); // подчищаем за собой unset($html); $k--; >
Ниже приведен ещё один пример использования библиотеки Simple HTML DOM Parser для парсинга HTML-страницы и извлечения заголовков новостей:
// Подключаем библиотеку require_once('simple_html_dom.php'); // Получаем содержимое страницы $html = file_get_html('http://example.com/news.html'); // Ищем все заголовки новостей foreach($html->find('h2.news-title') as $title) < // Выводим текст заголовка echo $title->plaintext; >
В этом примере мы используем библиотеку Simple HTML DOM Parser , которая предоставляет простой и удобный API для работы с HTML-документами. Сначала мы получаем содержимое страницы с помощью функции file_get_html() , затем находим все элементы с тегом h2 и классом news-title с помощью метода find() . Наконец, мы выводим текст каждого заголовка с помощью свойства plaintext .
Получение контента с помощью cURL
Неоспоримыми преимуществами в функционале пользуется библиотека или можно сказать модуль PHP — cURL . Для полноценного контролируемого получения контента здесь есть множество разных доплнений. Это и практически полноценный эмулятор браузерного обращения к сайту, работа скрипта через proxy с приватной идентификацией и многое другое. Ниже показана функция получения контента с помощью cURL .
function curl($url, $postdata='', $cookie='', $proxy='') < $uagent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16"; $ch = curl_init( $url ); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // возвращает веб-страницу curl_setopt($ch, CURLOPT_HEADER, 0); // возвращает заголовки @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // переходит по редиректам curl_setopt($ch, CURLOPT_ENCODING, ""); // обрабатывает все кодировки curl_setopt($ch, CURLOPT_USERAGENT, $uagent); // useragent curl_setopt($ch, CURLOPT_TIMEOUT, 10); // таймаут ответа //curl_setopt($ch, CURLOPT_MAXREDIRS, 10); // останавливаться после 10-ого редиректа if($proxy !='')if($mass_proxy[2]!="" and $mass_proxy[3]!="")< curl_setopt($ch, CURLOPT_PROXYUSERPWD,$mass_proxy[2].':'.$mass_proxy[3]);>// если необходимо предоставить имя пользователя и пароль 'user:pass' if(!empty($postdata)) < curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); >if(!empty($cookie)) < //curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/2.txt'); //curl_setopt($ch, CURLOPT_COOKIEFILE,$_SERVER['DOCUMENT_ROOT'].'/2.txt'); >$content = curl_exec( $ch ); $err = curl_errno( $ch ); $errmsg = curl_error( $ch ); $header = curl_getinfo( $ch ); curl_close( $ch ); $header['errno'] = $err; $header['errmsg'] = $errmsg; $header['content'] = $content; return $header['content']; >
Продвинутый скрипт получения контента на PHP
Ещё один способ получения контента встроенными функциями php я нашёл на просторах интернета. Пока не использовал, но привожу здесь для полноты картины, так как это решение тоже заслуживает достойного внимания. Далее, как в ©Источнике:
Полезными качествами, в данном контексте, будут возможность получения множества атрибутов запрашиваемого контента, а также возможность получения заголовка ответа сервера и времени выполнения запроса. Данная функция использует встроенные в PHP функции для работы с сокетами, которые предназначены для соединения клиента с сервером.
; $URL_SCHEME = ( isset($URL_PARTS['scheme']))?$URL_PARTS['scheme']:'http'; $URL_HOST = ( isset($URL_PARTS['host']))?$URL_PARTS['host']:''; $URL_PATH = ( isset($URL_PARTS['path']))?$URL_PARTS['path']:'/'; $URL_PORT = ( isset($URL_PARTS['port']))?intval($URL_PARTS['port']):80; if( isset($URL_PARTS['query']) && $URL_PARTS['query']!='' ) < $URL_PATH .= '?'.$URL_PARTS['query']; >; $URL_PORT_REQUEST = ( $URL_PORT == 80 )?'':":$URL_PORT"; //--- build GET request --- $USER_AGENT = ( $user_agent == null )?'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)':strval($user_agent); $GET_REQUEST = "GET $URL_PATH HTTP/1.0 " ."Host: $URL_HOST$URL_PORT_REQUEST " ."Accept: text/plain " ."Accept-Encoding: identity " ."User-Agent: $USER_AGENT "; //--- open socket --- $SOCKET_TIME_OUT = 30; $SOCKET = @fsockopen($URL_HOST, $URL_PORT, $ERROR_NO, $ERROR_STR, $SOCKET_TIME_OUT); if( $SOCKET ) < if( fputs($SOCKET, $GET_REQUEST)) < socket_set_timeout($SOCKET, $SOCKET_TIME_OUT); //--- read header --- $header = ''; $SOCKET_STATUS = socket_get_status($SOCKET); while( !feof($SOCKET) && !$SOCKET_STATUS['timed_out'] ) < $temp = fgets($SOCKET, 128); if( trim($temp) == '' ) break; $header .= $temp; $SOCKET_STATUS = socket_get_status($SOCKET); >; //--- get server code --- if( preg_match('~HTTP/(d+.d+)s+(d+)s+(.*)s* ~si', $header, $res)) $SERVER_CODE = $res[2]; else break; if( $SERVER_CODE == ABI_URL_STATUS_OK ) < //--- read content --- $content = ''; $SOCKET_STATUS = socket_get_status($SOCKET); while( !feof($SOCKET) && !$SOCKET_STATUS['timed_out'] ) < $content .= fgets($SOCKET, 1024*8); $SOCKET_STATUS = socket_get_status($SOCKET); >; //--- time results --- $TIME_END = explode(' ', microtime()); $TIME_TOTAL = ($TIME_END[0]+$TIME_END[1])-($TIME_START[0]+$TIME_START[1]); //--- output --- $URL_RESULT['header'] = $header; $URL_RESULT['content'] = $content; $URL_RESULT['time'] = $TIME_TOTAL; $URL_RESULT['description'] = ''; $URL_RESULT['keywords'] = ''; //--- title --- $URL_RESULT['title'] =( preg_match('~(.*) ~U', $content, $res))?strval($res[1]):''; //--- meta tags --- if( preg_match_all('~]+>~', $content, $res, PREG_SET_ORDER) > 0 ) < foreach($res as $meta) $URL_RESULT[strtolower($meta[1])] = $meta[2]; >; > elseif( $SERVER_CODE == ABI_URL_STATUS_REDIRECT_301 || $SERVER_CODE == ABI_URL_STATUS_REDIRECT_302 ) < if( preg_match('~location:s*(.*?) ~si', $header, $res)) < $REDIRECT_URL = rtrim($res[1]); $URL_PARTS = @parse_url($REDIRECT_URL); if( isset($URL_PARTS['scheme'])&& isset($URL_PARTS['host'])) $url = $REDIRECT_URL; else $url = $URL_SCHEME.'://'.$URL_HOST.'/'.ltrim($REDIRECT_URL, '/'); >else < break; >; >; >;// GET request is OK fclose($SOCKET); >// socket open is OK else < break; >; $TRY_ID++; > while( $TRY_ID ; ?>
Итак, входящими параметрами являются: $url — строка, содержащая URL http-протокола, $user_agent — строка с любым юзер-агентом (если пропустить параметр или установить его в null — user_agent будет как в IE). Константа MAX_REDIRECTS_NUM устанавливает количество разрешенных редиректов (поддерживаются 301 и 302 редиректы).
Теперь перейдем к примерам практического использования этой функции:
else print 'Запрашиваемая страница недоступна.'; ?>
Как видно из вышеприведенного примера, мы можем получить всю информацию по запрошенному URL . Кроме того, можно получить значения любого мета-тега. Для этого можно воспользоваться следующим кодом:
Заключение:
Парсер контента на языке PHP – это важный инструмент для получения и обработки данных из различных источников. Благодаря мощным библиотекам и инструментам, разработчики могут легко и удобно извлекать нужную информацию из HTML-страниц, XML-файлов и других форматов.
Дата публикации: 2019-04-26