Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен / web / Введение в PHP.doc
Скачиваний:
77
Добавлен:
18.05.2015
Размер:
3 Mб
Скачать

Указатель ссылки ("Referer")

Каждая транзакция включает ссылочный заголовок (Referer), идентифицирующий документ на сервере, на который указывает текущий URL. Ссылочный заголовок удобен для отслеживания связей между документами и анализа ошибки поиска документа 404.

Ссылочный заголовок может быть легко подделан. Назначение этого заголовка — служить для анализа приходящих гиперссылок на Web-страницы. Программная установка значения поля ссылочного указателя из PHP-программы с последующим запросом документа с заданного Web-сайта (А), позволяет ввести в заблуждение этот сайт и заставить его думать, что ссылка была создана от (В) на (А), даже если такая ссылка не существует.

Предположим, что пользователь Web-сайта следует по приведенной ниже гипер-ссылке:

<А href="http://my.com/my.рhр">Состояние</А>

с Web-страницы, находящейся по URL-адресу: http:/ftuzzyblog.com/about feedster.htm

Пользовательский клиент — Web-браузер — затем отправит на Web-сервер, находящийся на Feedster.com, следующую транзакцию:

GET /my.php HTTP/1.1 Host: my.com

Referer: http://fuzzyblog.com/aboutfeedster.com

При программировании на PHP доступ к значению ссылочного указателя (referer) предоставляет переменная $_SERVER:

$referer = $ SERVER['HTTP REFERER'];

РНР делает получение содержимого от источника HTTP чрезвычайно простым. Стандартный файл, функции file_get_content () или fopen() — вот и все, что необ-ходимо для получения содержимого от URL. Рассмотрим простой пример:

<?php

// Прочитать информацию с url в переменную $contents

$contents = file_get_contents("http://fu22yblog.com/index.php");

?>

Если вы используете библиотеку HttpClient, то можете извлекать содержимое одним из двух способов. Первый подход заключается в применении метода quickGet(). Этот метод, который может быть вызван без необходимости создания объекта клиента. Пример показан ниже:

<?php

SpageContents = HttpClient::quickGet("http://fuzzyblog.com/index.php"); ?>

Однако, как и встроенные функции РНР. метод quickGet () не предоставляет доступа к кодам состояния HTTP, как не дает доступа и к пользовательскому агенту. По этой причине quickGet () не имеет никаких существенных преимуществ перед встроенными функциями РНР. Чтобы использовать эти более развитые средства, вам нужно создать объект HTTP-клиента, как показано в следующем примере:

<?php

require_once "HttpClient.class.php";

$parts = parse_url ("http://fuzzyblog.com/index.php");

$host = $parts("host"];

$path = $partsl"path"];

$client = new HttpClient(Shost);

if (!$client->get('/')) i

die('Ошибка: '.$client->getError());

$pageContents = $client->getContent();

?>

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

Медиа-типы

Когда вы завершаете формирование HTTP-транзакции, запрашивающей содержи-мое, то один из заголовков, принимаемых клиентской программой, сообщает тип полученных данных. Этот заголовок, известный как описатель медиа-типа Internet, позволяет программному обеспечению, принимающему данные, принимать решение относительно того, как их следует обрабатывать. Предположим, например, что вы запросили URL, представляющий аудио-файл. Вообще говоря, браузер сам по себе не знает, как исполнять произвольный поток байт, который он получает, но, заглянув в принятый заголовок, он может определить, какое приложение следует вызвать для проигрывания аудио-файла.

Стандарт HTTP базируется на Internet Media Types, которые похожи на MIME-типы- стандарты Internet для идентификации различных типов медиа.

Когда происходит HTTP-транзакция, то клиент (браузер) в заголовке Accept сообщает серверу, какие он понимает медиа-типы. Затем сервер пытается отправить информацию одного из медиа-типов, поддерживаемых клиентом. Эта информация передается с использованием заголовка Content-header.

Когда происходит HTTP-транзакция без заголовка Accept, сервер предполагает, что клиент поддерживает все типы медиа. Существует три главные формы заголовка Accept:

Accept: * / * -Клиент принимает все медиа-типы.

Accept: тип/* -Клиент принимает класс медиа-типов. Например: image/*

означает, что тип графического образа не важен.

Accept: тип/подтип - Принимается только данный класс и тип. Например:

image/png означает, что принимаются только файлы рng.

Если клиент принимает множество типов документов, то он указывает это в един-ственном предложении Accept: и использует запятые для разделения их. Например: Accept: image/jpg, image/png, image/gif

Помимо использования заголовка Content-type с методом GET, клиент может также применять заголовок Content-type с методом POST или PUT. Это позволяет специ-фицировать формат данных, передаваемых в операции POST или PUT.