Назад | Перейти на главную страницу

Веб-сервер обрабатывает PDF-файл как неправильный тип MIME

После обновления до последней версии 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, а не на ваш код.