Оглавление

24.2. Функции для работы с заголовками

Перенаправление клиента на другой URL-адрес. 
Запрет кэширования страниц. 
Реализация ссылки Скачать.  Просмотр заголовков, отправляемых сервером

 

Функция header() позволяет добавить заголовок. Имеет следующий формат: header(<Заголовок>);

Например, чтобы перенаправить клиента на URL http://www.rambler.ru/, нужно написать следующий код:

header("Location: http://www.rambler.ru/");
exit();

Чтобы запретить кэширование документа, нужно послать сразу несколько заголовков:

header("Expires: Sun, 27 May 2007 01:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Pragma: no-cache"); 

 

 

Очень часто на сайтах можно видеть две ссылки: Открыть и Скачать. На­пример, у нас есть файл в формате Word с именем filename.doc. Реализовать первую ссылку достаточно просто:

<a href="filename.doc">Открыть</a>

При переходе по ссылке файл будет открыт соответствующей программой без запроса сохранения файла. Во всяком случае так поступит Microsoft Internet Explorer.

 

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


<a href="save.php">Скачать</a>

А в файле save.php пишем код, приведенный в листинге 39.

<?php
$path = 'filename.doc';
if (!file_exists($path)) {
   echo 'Файл не найден';
}
else {
   $size = filesize($path);
   header('Content-Type: application/msword');
   header('Content-Length: ' . $size);
   header('Content-Disposition: Attachment; FileName="' . $path . '"');
   readfile($path);
}
?>

 

При переходе по такой ссылке Web-браузер выведет диалоговое окно с запросом "Что делать с файлом?"
С помощью заголовков можно вывести данные, которые будут обработаны Microsoft Excel:

<?php
$text = "Артикул\tНазвание\tКоличество\n";
$text .= "001\tДискета\t100\n";
$text .= "002\tМонитор\t5\n";
$text .= "003\tHDD\t12\n";
header('Content-type: application/vnd.ms-excel');
$d = date('d_m_Y');
header('Content-Disposition: Attachment; FileName="price_' . $d . '.xls"');
echo $text;
exit();
?>

 

 

У этого способа существует минус. По умолчанию все ячейки таблицы име­ют формат "Общий". В этом формате число 001 будет преобразовано в число 1, нули в начале будут удалены. Задать формат "Текстовый" для определенной ячейки можно, представив таблицу в формате HTML:

 

<?php
header('Content-type: application/vnd.ms-excel');
$d = date('d_m_Y');
header('Content-Disposition: Attachment; FileName="price_' . $d . '.xls"');
?>
<html>
<head>
<title>Пример</title>
<meta http-equiv="content-type" content="text/html; charset=windows-1251">
<style type="text/css">
td {
    font-size:10.0pt;
    font-family:"Arial Cyr";
    mso-number-format:General;
    text-align:general;
    vertical-align:bottom;
    white-space:nowrap;
}
.txt { mso-number-format:"\@"; }
</style>
</head>
<body>
<table border="1" cellpadding="0" cellspacing="0">
<tr valign="bottom">
   <td class="txt" width="65"><b><center>Артикул</center></b></td>
   <td width="100"><b><center>Название</center></b></td>
   <td width="100"><b><center>Количество</center></b></td>
</tr>
<tr valign="bottom">
   <td class="txt">001</td>
   <td>Дискета</td>
   <td>100</td>
</tr>
<tr valign="bottom">
   <td class="txt">002</td>
   <td>Монитор</td>
   <td>5</td>
</tr>
<tr valign="bottom">
   <td class="txt">003</td>
   <td>HDD</td>
   <td>12</td>
</tr>
</table>
</body>
</html>

Обратите внимание, нули в артикуле остались. Чтобы узнать какие значения необходимо указать, создайте таблицу в Excel, отформатируйте данные, а затем сохраните таблицу в формате HTML и отобразите исходный код.

 

Посмотреть заголовки, отправляемые сервером, позволяет функция get_headers(). Функция имеет следующий формат: get_headers(<URL-адрес>); 

 

В параметре <URL-адрес> должен быть указан абсолютный путь к файлу:

$url = "http://localhost/index.php";
echo "<pre>";
print_r(get_headers($url));
echo "</pre>";

Функция возвращает массив с заголовками, который будет отображен так:

Array (

[0] => HTTP/1.1 200 OK

[1] => Date: Fri, 13 Nov 2009 22:32:17 GMT

[2] => Server: Apache/2.2.14 (Win32) PHP/5.3.0

[3] => X-Powered-By: PHP/5.3.0

[4] => Connection: close

[5] => Content-Type: text/html; charset=windows-1251

[6] => Content-Language: ru )

Примечания:
  • Так как функция header() устанавливает заголовки ответа сервера, кото­рые посылаются до отсылки основного содержимого документа, то перед функцией не должно быть никаких операторов вывода. Даже пустая строка перед открывающим PHP-дескриптором (<?php) вызовет ошибку. Пустые строки внутри PHP-дескрипторов ошибку не генерируют, так как вывод ин­формации осуществляется только с помощью операторов echo или print. Кроме того, при использовании кодировки UTF-8 файл должен быть в коди­ровке UTF-8 без BOM.

Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити