Установка заголовков php

Статус
Закрыто для дальнейших ответов.

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Есть страничка php, на которой выводятся изображения вида:
<img src="/img.php?id_img=1" alt="img" /><img src="/img.php?id_img=2" alt="img" /><img src="/img.php?id_img=3" alt="img" />...Файлик img.php кое-что проверяет и при необходимости отдает изображение юзеру, вот его код:
<?require_once $_SERVER["DOCUMENT_ROOT"].'/function.conf';$id_file = intval($_GET['id_img']);$info_file = $_SESSION['gallery_hash_img'][$id_file];// Разрешено ли в сессии отдать изображение и есть ли путь в сессии к этому изображению?if($info_file['autoriz'] === true && $info_file['path']) { file_download($info_file['path'], 'browser');}// Иначе отдает изображение о том, что сюда доступ закрытelse { $path = 'img/default/no_img_dostup.jpg'; file_download($path, 'browser');}Вот код функции file_download, которая отдает изображения (немного сокращена до необходимого):
function file_download($file_path, $type_upload = false) {$file_path = $_SERVER["DOCUMENT_ROOT"].'/'.$file_path; if (is_file($file_path)) { $day_tmp = date('d') + 30; $sec_tmp = 30 * 24 * 60 * 60; header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($file_path)).' GMT'); header('Expires: '.date("D, $day_tmp M Y H:i:s").' GMT'); header("Cache-Control: public"); header("Content-type: image/jpeg"); header('Content-Disposition: inline; filename='.basename($file_path)); header('Content-Length: '.filesize($file_path)); readfile($file_path); exit; }}

Но вместо нужных заголовков получаю не правильные и картинки не кешируются, вот что говорит гугл-хром:
Cache-Control:max-age=2592000, publicConnection:Keep-AliveContent-Disposition:inline; filename=c39d249aa9268d35d5cf7b8146da5d97.jpgContent-Length:4039Content-Type:image/jpegDate:Fri, 18 Oct 2013 14:18:31 GMTExpires:Fri, 48 Oct 2013 18:18:31 GMTKeep-Alive:timeout=5, max=100Pragma:no-cacheServer:LiteSpeedX-Powered-By:pHP/5.3.27
Подозреваю, что это из-за штакета, который находится в корне сайта, в нем указано, что php файлы не кешировать. Что посоветуете?
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Косяк уже нашел, исправил. Тут был:
$day_tmp = date('d') + 30;header('Expires: '.date("D, $day_tmp M Y H:i:s").' GMT');В итоге получалась дата, типа 48 октября, а такой ведь не существует на самом деле. Поэтому не работало. Поменял на это, стало работать:
$day_tmp = time() + 30 * 24 * 60 * 60;header('Expires: '.date("D, d M Y H:i:s", $day_tmp).' GMT');Однако работает это только на локалке. Выложил на хост, дык заголовки он не ставит, а устанавливает какие-то свои.. Хостинг обычный виртульный, самый дешевенький. В чем может быть проблемка?)
 

CamaroSS

Well-Known Member
Регистрация
21.02.2012
Сообщения
176
Это из-за 48 октября :)
У меня (схематично) прокси-скрипт для изображений работает так (по-моему, выкладывал где-то уже):
PHP:
if(/* Изображение не найдено */)
{
  header ($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
  exit();
}

if(/* Изображение запрещено */)
{
  header ($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');
  exit();
}

$lastmod = filemtime(/* Путь к файлу */);
$srcImage = ImageCreateFromJPEG( /* Путь к файлу */ );

if($srcImage === false) {
    header ($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Error');
    exit();
}

header ("Cache-Control: private");
header ("Pragma: private");


if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lastmod) {
    header ($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
    exit;
}

header ("Content-type: image/jpeg");  //например
header ("Expires: " . gmdate('D, d M Y H:i:s GMT', strtotime('+ 1 months')));
header ("Last-Modified: " . gmdate('D, d M Y H:i:s GMT', filemtime($_GET['foto'])));

ob_start();

imagejpeg($srcImage, NULL, 100);

header ("Content-Length: " . ob_get_length());
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Работает, но только на localhost. В интернет выкладываю - нет заголовков нужных. Почитал про директиву "AllowOverride" - однако она запрещает заголовки и остальное только штакетом.
Может ли хостер как-то отключить использование некоторых header'ы на уровне конфигов?
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 137
На ihc какие то левые команды htaccess (в смысле немного отличается построение)
Сам пару раз сталкивался, писал в поддержку и они выдавали мне решение ни как у всех
напиши в поддержку.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
BaNru сказал(а):
На ihc какие то левые команды htaccess (в смысле немного отличается построение)
Сам пару раз сталкивался, писал в поддержку и они выдавали мне решение ни как у всех
напиши в поддержку.
Так мне то заголовки нужно установить не через штакет, а через php для отдельных изображений. Я не знаю ещё функций для установки заголовков, кроме header. Но попробую напишу, может быть подскажут что-нибудь.
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 137
Ну так header же передается. Дата срабатывала же
Expires:Fri, 48 Oct 2013 18:18:31 GMT)))
Я у себя запускал, там уже 50+ было )))
Поясни, какая строка именно не срабатывает?
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
BaNru сказал(а):
Ну так header же передается. Дата срабатывала же
Expires:Fri, 48 Oct 2013 18:18:31 GMT)))
Я у себя запускал, там уже 50+ было )))
Поясни, какая строка именно не срабатывает?
Вот какие заголовки должны быть:
$day_tmp = time() + (30 * 24 * 60 * 60);$path_parts = pathinfo($file_path);$ext = strtolower($path_parts["extension"]);switch($ext){ case 'gif': $tpe = 'image/gif'; break; case 'png': $tpe = 'image/png'; break; case 'jpg': $tpe = 'image/jpeg'; break; case 'jpeg': $tpe = 'image/jpeg'; break; default: $tpe = 'image/jpeg'; break;}header('Accept-Ranges: bytes');header("Cache-Control: private");header('Content-Disposition: inline; filename='.basename($file_path));header('Content-Length: '.filesize($file_path));header("Content-type: $tpe");header('Expires: '.date("D, d M Y H:i:s", $day_tmp).' GMT');header('Pragma: private');header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($file_path)).' GMT');
А вот что получаю при загрузке в интернете (не правильные):
Cache-Control:max-age=2592000, publicConnection:Keep-AliveContent-Disposition:inline; filename=7c12dd8a268c1aa98be91e6ebb5248f4.pngContent-Length:87605Content-Type:image/jpegDate:Tue, 22 Oct 2013 05:41:40 GMTExpires:Tue, 52 Oct 2013 09:41:40 GMTKeep-Alive:timeout=5, max=100Pragma:no-cacheServer:LiteSpeedX-Powered-By:pHP/5.3.27
А это у меня на localhost'е (так должно быть):
Accept-Ranges:bytesCache-Control:privateConnection:Keep-AliveContent-Disposition:inline; filename=9f6d59d8b4b5d36597e2904ba31afe94.pngContent-Length:62127Content-Type:image/pngDate:Tue, 22 Oct 2013 05:48:31 GMTExpires:Thu, 21 Nov 2013 09:48:31 GMTKeep-Alive:timeout=5, max=99Server:Apache/2.2.22 (Win32) DAV/2 PHP/5.3.10В интернете некоторые заголовки отказываются изменяться :( Пробовал загружать новые изображения, заходил с другого браузера - толку ноль. Expires не правильный, pragma не меняется, сache-conrol тоже не хочет меняться. И, кстати, last-modifed тоже не хочет ставиться ни на локалхосте, ни в инете. Фиг знает почему.. (
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 137
И так по порядку
В заголовке Accept-Ranges перечисляются только единицы измерения.
header('Accept-Ranges: 1000');Возвращает
header("Cache-Control: max-age=1000, public, no-transform, must-revalidate");
Cache-Control max-age=1000, public, no-transform, must-revalidate
или соответственно
С Pragma тоже всё нормально
Expires и Last-Modified тоже проставляются

Заюзал вроде все "проблемные" хедеры - в ответ в общем всё выдает нормально.
Скопипастил твой код как есть, всё работает
(Status-Line) HTTP/1.1 200 OK
Date Tue, 22 Oct 2013 07:04:57 GMT
Server LiteSpeed
Connection Keep-Alive
Keep-Alive timeout=5, max=100
X-Powered-By PHP/5.3.27
Accept-Ranges bytes
Cache-Control private
Content-Disposition inline; filename=
Content-Type image/jpeg
Expires Thu, 21 Nov 2013 11:04:57 GMT
Pragma private
Last-Modified Thu, 01 Jan 1970 00:00:00 GMT
Content-Length 0
С хостингом всё в порядке. Задавай корректные хедеры, а не от балды.
Ну или да, пиши в поддержку, может сервачек с твоим хостом кривой )))
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 137
Tue, 52 Oct 2013 16:45:49 GMT
Гыыы, опять ты за своё
Блин, создай пустой файл и выставляй заголовки по одному, без функций и прочего Затем скажи, какой именно не проходит. Скорее всего один кривой заголовок рушит всё последующее.
 

CamaroSS

Well-Known Member
Регистрация
21.02.2012
Сообщения
176
Ну есть же
Код:
gmdate('D, d M Y H:i:s GMT', strtotime('+ 1 months')
, чего мучаться.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Так, с expires разобрался, он там работать не хотел из-за лишнего пробела. Фиг знает почему, хотя на локалхосте работало. Теперь все заголовки работают на сервере.
Но last-modifed не устанавливается на localhost'e, хотя в интернете на сервере все верно указывается(( Из-за чего это может быть? Хотелось бы узнать, чтобы потом не столкнуться с этой проблемой в уже работающем варианте и опять не создавать тему о заголовках.
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 137
тебе выше подсказали команду strtotime, попробуй через неё прогнать получаемую дату.
А может быть потому что вындовс? Там же другая политика файловой системы.
гугли last-modifed плюс denwer или windows
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
BaNru сказал(а):
А может быть потому что вындовс?
Может быть)

BaNru сказал(а):
Там же другая политика файловой системы
А политика причем? о_О filemtime же верно выдает время изменения файла. Остается только послать заголовок, но отказывается посылаться..(

BaNru сказал(а):
гугли last-modifed плюс denwer или windows
Ок)
 
Статус
Закрыто для дальнейших ответов.
Верх Низ