Ещё раз HEADER...

SimpleTak

Новичок
Ещё раз HEADER...

Проблема вот в чём:
PHP:
case 'doload':
	$ath=basename($file);
	header("Content-disposition: attachment; filename=\"$ath\";");
	header("Content-type: multipart/byteranges");
	header("Content-Length: ".filesize($file));
	readfile($file);
break;
Этот код нормально работает, но иногда, вместо предложения пользователю загрузить/открыть файл $file, от выводит в окно браузера текст:
HTTP/1.1 200 OK Date: Tue, 26 Jul 2005 08:05:48 GMT Server: Apache/2.0.54 (Win32) PHP/4.3.11 X-Powered-By: PHP/4.3.11 Content-disposition: attachment; filename="content.html"; Content-Length: 15427 Keep-Alive: timeout=15, max=85 Connection: Keep-Alive Content-Type: multipart/byteranges
и соответственно снизу дозаписывет исходный код $file.

Как можно этого избежать???
:confused: :confused: :confused:
 

SimpleTak

Новичок
IE 6 - иногда выдаёт вышеописанную ошибку

Firefox 1.0.3 - или вообще ничего не делает или выводит исходный текст страницы, на которой есть ссылка на данный выше скрипт (т.е. выводит НЕ $file)

Opera 8.01 - всё прекрасно работает, ошибок небыло
 

Кром

Новичок
А что за файл ты выводишь и зачем используешь multipart/byteranges?
 

SimpleTak

Новичок
Вывожу я совершенно разнообразные файлы, начиная от кортинок, заканчивая *.html ...

даже, если "multipart/byteranges" здесь не нужен, то его отсутствие делу никак не помогает...


--- изменение Content-type на правильно значение */* ничего не дало, только при загрузке в Опере тип файла стал определятся правильно...:
PHP:
header("Content-type: */*");
 

Кром

Новичок
>даже, если "multipart/byteranges" здесь не нужен, то его отсутствие делу никак не помогает...

Т.е. я правильно понимаю, ты не читал спецификацию по этому заголовку?

>header("Content-type: */*");

Это тоже не то, ты ведь пытаешся скачивать картинки и т.д.

Попробуй такие заголовки:

PHP:
header('Content-Type: application/force-download');
	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
	header('Pragma: no-cache');
	header('Expires: 0');
	header('Content-Disposition: attachment; filename="' . $fileName . '"');
	header('Connection: close');
 

SimpleTak

Новичок
Всё прекрасно работает! Большое спасибо!

Есть ли какя-нибудь программа или вообще что нибудь для просмотра отправляемого серверу запрса и получаемого отклика?

:confused: :confused: :confused:
 

SimpleTak

Новичок
В общем, я уже не знаю что делать...
Проверил обмен заголовками и получил:

----------------------------------------------------------
http://x-test/system/dir.php?file=S%3A%2Fhome%2Fx-test%2Fwww%2Fremview.php&act=view

-> GET /system/dir.php?file=S%3A%2Fhome%2Fx-test%2Fwww%2Fremview.php&act=view HTTP/1.1
Host: x-test
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.7) Gecko/20050414 Firefox/1.0.3
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ru-ru,ru;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://x-test/system/dir.php?file=S%3A%2Fhome%2Fx-test%2Fwww%2Fremview.php&act=view

<- HTTP/1.x 200 OK
Date: Tue, 26 Jul 2005 15:31:48 GMT
Server: Apache/2.0.54 (Win32) PHP/4.3.11
X-Powered-By: PHP/4.3.11
Keep-Alive: timeout=15, max=92
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html
----------------------------------------------------------
http://x-test/system/panel.php

-> GET /system/panel.php HTTP/1.1
Host: x-test
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.7) Gecko/20050414 Firefox/1.0.3
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ru-ru,ru;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://x-test/system/dir.php?file=S%3A%2Fhome%2Fx-test%2Fwww%2Fremview.php&act=view

<- HTTP/1.x 200 OK
Date: Tue, 26 Jul 2005 15:31:49 GMT
Server: Apache/2.0.54 (Win32) PHP/4.3.11
X-Powered-By: PHP/4.3.11
Keep-Alive: timeout=15, max=91
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html
----------------------------------------------------------
http://x-test/~view

-> GET /~view HTTP/1.1
Host: x-test
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.7) Gecko/20050414 Firefox/1.0.3
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ru-ru,ru;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://x-test/system/dir.php?file=S%3A%2Fhome%2Fx-test%2Fwww%2Fremview.php&act=view

<- HTTP/1.x 200 OK
Date: Tue, 26 Jul 2005 15:31:49 GMT
Server: Apache/2.0.54 (Win32) PHP/4.3.11
X-Powered-By: PHP/4.3.11
Content-Length: 345
Keep-Alive: timeout=15, max=92
Connection: Keep-Alive
Content-Type: text/html
----------------------------------------------------------
http://x-test/system/file.php?v=plain

-> GET /system/file.php?v=plain HTTP/1.1
Host: x-test
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.7) Gecko/20050414 Firefox/1.0.3
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ru-ru,ru;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://x-test/~view

<- HTTP/1.x 200 OK
Date: Tue, 26 Jul 2005 15:31:49 GMT
Server: Apache/2.0.54 (Win32) PHP/4.3.11
X-Powered-By: PHP/4.3.11
Cache-Control: must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Keep-Alive: timeout=15, max=90
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/plain; charset=windows-1251
----------------------------------------------------------


А проблема в следующем:

есть страница (dir.php), на ней стоит ссылка (http://x-test/system/dir.php?file=S%3A%2Fhome%2Fx-test%2Fwww%2Fremview.php&act=view)

после перехода по этой ссылке генерируется новая страница, на которой через window.open(...) открывается дочернее окно.

в момент открытия окна mod_rewrite изменяет ссылку и открывает файл http://x-test/~view , который физически распологается здесь: /system/file.php

Файл file.php генерирует html-код, который в свою очередь содержит вложенный фрейм, который ссылается на этуже страницу (file.php), но с другими параметрами.

Проблема в том, что file.php во фрейме должен изменять header в зависимости от условия.

Вся эта систама работает абсолютно нормально в Opere 8, Firefox'e 1.0.3 и Netscape 8.02,
а вот в IE работать отказывается...

-~{}~ 26.07.05 23:01:

В общем получается так, что если передавать вручную определённые заголовки (через header), то IE предлагает загрузить этот файл, а если нет, то он его отображает нормально (и, как я уже и писал, такая проблема есть только в IE)...
 

Кром

Новичок
В общем получается так, что если передавать вручную определённые заголовки (через header), то IE предлагает загрузить этот файл, а если нет, то он его отображает нормально (и, как я уже и писал, такая проблема есть только в IE)...
А почемы ты называешь это проблемой? :) Это вполне нормальное поведение IE - в зависимости от заголовков выводить сам файл или окно загрузки.
 

SimpleTak

Новичок
Как можно вывести сам файл?

в стандартных вариантах это у меня труда не вызывает...
здесь получается следующее (в IE):

при определении заголовка Content-Type: text/plain; charset=windows-1251
и при попытке вывести файл секцией plain, он предлагает загрузить файл dir.php. (для файлов php)
Но, если этой секцией выводить любой графический файл, то он его выводит, но без преобразования в text/plain, т.е. выводит картинку картинкой. Такая же фигня с html-файлами.

если определить тип как Content-Type: image/gif;
IE выводит нормально и картинки (картинка картинкой) и
файлы php выводит исходный код
файлы html, воводит предварительно их обрабатывая, т.е. выводит не исходный текст, а полученный результат...

Короче думаю я, что нужно как-то Content-Type определить правильно, а как, незнаю...
(всю спецификацию перерыл, толком ничего ненашёл)

------ секция plain ------ находится в файле dir.php ------
PHP:
	case 'plain':
	header("Content-Type: text/plain; charset=windows-1251");
	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
	header('Pragma: no-cache');
	$mf='temp/file';
	$f=explode('<-n|&|f->',file_get_contents($mf));
	echo $f[1];
	break;
 

Кром

Новичок
при определении заголовка Content-Type: text/plain; charset=windows-1251
и при попытке вывести файл секцией plain, он предлагает загрузить файл dir.php. (для файлов php)
Но, если этой секцией выводить любой графический файл, то он его выводит, но без преобразования в text/plain, т.е. выводит картинку картинкой. Такая же фигня с html-файлами.

если определить тип как Content-Type: image/gif;
IE выводит нормально и картинки (картинка картинкой) и
файлы php выводит исходный код
файлы html, воводит предварительно их обрабатывая, т.е. выводит не исходный текст, а полученный результат...
Рехнуться мозгами! :)
Ты даже не представляешь, какую чушь несешь.
Продолжай читать спецификацию.
 

SimpleTak

Новичок
сайчас на Холме сайтик тестовый сотворю, увидишь, что этот бред не бред, а картинка картинкой выводится при Content-Type: text/plain....

или мне просто поспать пойти?.... :)
 

Кром

Новичок
>а картинка картинкой выводится при Content-Type: text/plain

Как говорил А. Лебедев: У тебя может и будет выводиться, а всего интернета не будет.

>или мне просто поспать пойти?.... :)

Именно. И вообще, побольше бывать на свежем воздухе.
 

Мутник

Новичок
как вариант: mime_content_type() только он не везде есть + часто настроен криво как то....
 

Кром

Новичок
>как вариант: mime_content_type() только он не везде есть + часто настроен криво как то....

Вариант чего?
Отдавать текстовые файлы предварительно проверяя их mime, это уже слишком.
 

SimpleTak

Новичок
да нет, я всю эту муть упростил, так, что всё работает нормально...
но существование проблем у IE с header - это точно...

Всем спасибо! :)
Кром - отдельное большое спасибо, за то, что читал эту муть, -сейчас перечитываю, волосы на голове дрожат... :)

-~{}~ 28.07.05 19:56:

----- У МЕНЯ КИПЯТ МОЗГИ (опять) -----

Почему
PHP:
header("HTTP/1.1 410 Gone");
воспринимается только IE ???, а Firefox и Opera чхать хотели на этот заголовок ???
 

Кром

Новичок
Почему
header("HTTP/1.1 410 Gone");
воспринимается только IE ???, а Firefox и Opera чхать хотели на этот заголовок ???
А что в твоем понятие означают слова "воспринимается" и "чхать хотели"? И что ты ждешь от этого заголовка, если не секрет?
 

SimpleTak

Новичок
От этого заголовка я ожидаю увидеть то, что показывает IE, а именно:

заголовок: HTTP 410 Потеряно

Страница не существует
Эта страница была удалена.

HTTP Ошибка 410 - Постоянно недоступна
--------------

в общем хочу страницу с сообщением об ошибке...
или это невозможно?

и ещё:
если в .htaccess написать ErrorDocument 403 /error/403.html
- то всё работает нормально, и этот заголовок отправлять как
PHP:
header("HTTP/1.0 403 Forbidden");
- то IE отобразит свою страницу ошибки , а не /error/403.html

А если просто возникнет ошибка 403, то (например, доступ к директории, где нет индексного файла) выведется /error/403.html

Так как мне быть? или я уже безнадёжен?
 
Сверху