Эти заголовки являются поддельными!
Content-Transfer-Encoding: binary
Этот заголовок скопирован из заголовков электронной почты. Это не относится к HTTP просто потому, что в HTTP нет другого способа передачи, кроме двоичного. Установка имеет такой же смысл, как и установка X-Bits-Per-Byte: 8
.
Cache-control: pre-check=0, post-check=0
Эти нестандартные значения определяют, когда IE должен проверять, является ли кэшированное содержимое свежим. 0
является значением по умолчанию, поэтому установка его на 0
- пустая трата времени. Эти директивы применяются только к кешируемому контенту, и Expires:0
и must-revalidate
подсказывают, что вы хотели сделать его не кешируемым.
Content-Description: File Transfer
Это еще один подражатель электронной почты. По умолчанию этот заголовок никак не влияет на загрузку . Это просто информативный текст в свободной форме. Технически он так же полезен, как заголовок X-Hi-Mom: I'm sending you a file!
.
header( 'Cache-Control: must-revalidate, pre-check=0, post-check=0' );
header( 'Cache-Control: public' );
В PHP вторая строка полностью перезаписывает первую. Вы, кажется, наносите удар в темноте.
Что действительно имеет значение
Content-Disposition: attachment
Вам не нужно вставлять туда имя файла (вы можете использовать трюк mod_rewrite
или index.php/fakefilename.doc
- он дает гораздо лучшую поддержку специальных символов и работает в браузерах, которые игнорируют необязательный Content-Disposition
заголовок).
В IE не имеет значения, находится ли файл в кеше или нет («Открыть» не работает для файлов, которые не кэшируются), и есть ли у пользователя плагин, который утверждает, что поддерживает тип файла, который обнаруживает IE.
Чтобы отключить кеш, вам нужно всего лишь Cache-control:no-cache
(без 20 дополнительных фальшивых заголовков), а чтобы сделать файл кэшируемым, вам не нужно ничего отправлять.
Примечание: PHP имеет ужасную ошибку, называемую session.cache_limiter
, которая безнадежно портит заголовки HTTP, если вы не установите его в none
.
ini_set('session.cache_limiter','none'); // tell PHP to stop screwing up HTTP