После обновления до последней версии Joomla загрузки с веб-сайта, над которым я работаю, обслуживаются неправильно.
Пример страницы: http://www.pacificpolicy.org/index.php?option=com_content&view=article&id=259:mic-paper&catid=39:rokfeature
Они обслуживаются с правильным расположением содержимого при первом посещении, но при последующих посещениях PDF-файлы загружаются как text / html (т.е. отображают содержимое файла на экране).
Как заставить браузер правильно загружать PDF-файл при каждом посещении? Мои знания о заголовках PHP и http довольно элементарны, поэтому мне нужна помощь в диагностике.
Хост - это LAMP-сервер, Joomla - 1.5.22, плагин управления документами - Rubberdoc.
Заголовок ответа при втором посещении гласит:
Date: Thu, 16 Dec 2010 04:29:03 GMT
Server: Apache/XXx
X-Powered-By: PHP/xxx
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
Etag: db71388c6fc952682ae2fd733d4b09c5
Content-Encoding: gzip
X-Content-Encoded-By: Joomla! 1.5
Expires: Mon, 1 Jan 2001 00:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Host
Last-Modified: Thu, 16 Dec 2010 04:29:03 GMT
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
Документы для загрузки вызываются из файла PHP, который выглядит следующим образом:
<?php
// Check to ensure this file is included in Joomla!
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport( 'joomla.application.component.view');
/**
* HTML View class for the RubberDoc component
*
* @static
* @package Joomla
* @subpackage RubberDoc
* @since 1.0
*/
class RubberDocViewDoc extends JView
{
public function display($tpl = null)
{
global $mainframe, $option;
$id = JRequest::getInt('id');
if(!$id)
{
JError::raiseError(404, 'Page Not Found');
return;
}
$model =& $this->getModel('doc');
$model->hit();
$data =& $model->getData();
$fileName =& $data->get('file');
$dirname = $mainframe->getParams('com_rubberdoc')->get('rubberdoc_dir', 'rubberdoc');
$filePath = JPath::clean( JPATH_SITE.DS.$dirname.DS.$fileName );
if( !JFile::exists( $filePath ) )
{
JError::raiseError(404, 'Page Not Found');
return;
}
$fileName = $data->get('file');
$extension = array_pop( explode('.', $fileName) );
$fileName = $data->get('alias').'.'.$extension;
$fileContent = JFile::read( $filePath );
$fileSize = strlen($fileContent);
require(JPATH_COMPONENT.DS.'helpers'.DS.'mime.mapping.php');
$mime = $mime_extension_map[$extension]; //application/octet-stream
// required for IE, otherwise Content-disposition is ignored
if(ini_get('zlib.output_compression')) {
ini_set('zlib.output_compression', 'Off');
}
$doc =& JFactory::getDocument();
$doc->setMimeEncoding( $mime );
$doc->setModifiedDate( $data->get('modified') );
$doc->render();
header('Content-Disposition: attachment; filename="'.$fileName.'" ');
header('Content-Length: '. $fileSize);
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Transfer-Encoding: binary');
if( ! ini_get('safe_mode') ) { // set_time_limit doesn't work in safe mode
@set_time_limit(0);
}
echo $fileContent;
}
}
Спасибо, Ник Порт Вила, Вануату
Трудно сказать наверняка, но я подозреваю, что при первом посещении они обслуживаются java-кодом, который устанавливает правильный тип mime. После этого, вероятно, происходит какое-то кеширование, которое не устанавливает правильный тип mime. Посмотрите, есть ли на диске какие-либо PDF-файлы. Если это так, вам нужно смотреть на конфигурацию apache, а не на ваш код.