Apache все файлы php

Отдаем файлы эффективно с помощью PHP

Метод хорош тем, что работает с коробки. Надо только написать свою функцию отправки файла (немного измененный пример из официальной документации):

function file_force_download($file) < if (file_exists($file)) < // сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт // если этого не сделать файл будет читаться в память полностью! if (ob_get_level()) < ob_end_clean(); >// заставляем браузер показать окно сохранения файла header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); // читаем файл и отправляем его пользователю readfile($file); exit; > > 

Таким способом можно отправлять даже большие файлы, так как PHP будет читать файл и сразу отдавать его пользователю по частям. В документации четко сказано, что readfile() не должен создавать проблемы с памятью.

  • Скрипт ждет пока весь файл будет прочитан и отдан пользователю.
  • Файл читается в внутренний буфер функции readfile(), размер которого составляет 8кБ (спасибо 2fast4rabbit)

2. Читаем и отправляем файл вручную

Метод использует тот же Drupal при отправке файлов из приватной файловой системы (файлы недоступны напрямую по ссылкам):

function file_force_download($file) < if (file_exists($file)) < // сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт // если этого не сделать файл будет читаться в память полностью! if (ob_get_level()) < ob_end_clean(); >// заставляем браузер показать окно сохранения файла header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); // читаем файл и отправляем его пользователю if ($fd = fopen($file, 'rb')) < while (!feof($fd)) < print fread($fd, 1024); >fclose($fd); > exit; > > 
  • Скрипт ждет пока весь файл будет прочитан и отдан пользователю.
  • Позволяет сэкономить память сервера
Читайте также:  Имеет ли метка html закрывающую метку

3. Используем модуль веб сервера

3a. Apache

Модуль XSendFile позволяет с помощью специального заголовка передать отправку файла самому Apache. Существуют версии по Unix и Windows, под версии 2.0.*, 2.2.* и 2.4.*

В настройках хоста нужно включить перехват заголовка с помощью директивы:

Также можно указать белый список директорий, файлы в которых могут быть обработаны. Важно: если у Вас сервер на базе Windows путь должен включать букву диска в верхнем регистре.

Описание возможных опций на сайте разработчика: https://tn123.org/mod_xsendfile/

function file_force_download($file) < if (file_exists($file)) < header('X-SendFile: ' . realpath($file)); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename($file)); exit; >> 
3b. Nginx

Nginx умеет отправлять файлы из коробки через специальный заголовок.

Для корректной работы нужно запретить доступ к папку напрямую через конфигурационный файл:

Пример отправки файла (файл должен находиться в директории /some/path/protected):

function file_force_download($file) < if (file_exists($file)) < header('X-Accel-Redirect: ' . $file); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename($file)); exit; >> 

Больше информации на странице официальной документации

  • Скрипт завершается сразу после выполнения всех инструкций
  • Физически файл отправляется модулем самого веб сервера, а не PHP
  • Минимальное потребление памяти и ресурсов сервера
  • Максимальное быстродействие

Update: Хабраюзер ilyaplot дает дельный совет, что лучше слать не application/octet-stream , а реальный mime type файла. Например, это позволит браузеру подставить нужные программы в диалог сохранение файла.

Источник

Apache загружает файлы php вместо их отображения

Я ранее установил php 5.3.x, но решил обновить. Сначала я удалил php 5.3.x, а затем установил php 5.5.1, но после завершения установки apache не разобрал файлы php, которые он просто скачал. Я проверил похожие вопросы здесь, в stackoverflow, но ни один из них не помог мне до сих пор.

Для записи у меня есть следующие строки в моих httpd.conf и php.conf, которые должны делать работу php, но не делают:

AddHandler application/x-httpd-php .php5 .php4 .php .php3 .php2 .phtml AddType application/x-httpd-php .php5 .php4 .php .php3 .php2 .phtml AddType application/x-httpd-php-source .phps AddHandler php5-script .php 

Я бы очень признателен за любую помощь. Спасибо.

У меня эти строки в php.conf

 LoadModule php5_module modules/libphp5.so LoadModule php5_module modules/libphp5-zts.so  
AddType application/x-httpd-php .php5 .php4 .php .php3 .php2 .phtml 

apache больше не загружает файл. Теперь apache показывает исходный код, но не все это просто часть. я добавил

Правильный AddType для php – application / x-httpd-php

AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps 

Также убедитесь, что ваш php-модуль загружен

LoadModule php5_module modules/mod_php55.so 

Когда вы настраиваете апач попытайтесь просмотреть страницу из другого браузера – У меня были дни, когда хром упорно кэширует результат и сохраняет загрузку исходного кода в то время как в другом браузере, это просто прекрасно.

После долгих проблем я наконец решил проблему.

Если вам будет предложено загрузить файл .php вместо его выполнения, тогда это идеальное решение: я предполагаю, что вы уже установили PHP5 и все еще получаете эту ошибку.

Но если вы все еще получаете ошибку:

Config file php5.conf not properly enabled: /etc/apache2/mods-enabled/php5.conf is a real file, not touching it 

затем выполните следующие действия:

Оказывается, файлы не должны храниться в mods-enabled , а скорее должны храниться в mods-available . Затем символическая ссылка должна быть создана с поддержкой модов, указывая на файл, хранящийся в доступных модах.

$ mv /etc/apache2/mods-enabled/php5.conf /etc/apache2/mods-available/ 

Затем создайте символическую ссылку:

$ ln -s /etc/apache2/mods-available/php5.conf /etc/apache2/mods-enabled/php5.conf 

Надеюсь, ваша проблема решена.

Сегодня я столкнулся с этой проблемой, и ни одно из описанных решений не помогло мне. Итак, вот еще одна возможная причина:

Если у вас есть что-то вроде

AddHandler x-mapp-php6 .php3 .php4 .php .phtml 

в файле .htaccess вашего веб-содержимого, это может привести к тому, что ваши скрипты PHP перестанут работать. В моем случае сервер не знал тип x-mapp-php6 , так как этот файл .htaccess был чем-то, что я импортировал с другого веб-хоста, когда я передал содержимое веб-сайта.

Просто удаление строки AddHandler из файла .htaccess разрешило это для меня.

Пожалуйста, взгляните на свои директивы addtype.

Мне кажется, что Apache сообщает браузеру, что он отправляет тип документа application / php для скриптов с расширениями, например .php5. На самом деле Apache должен сообщить браузеру, что сценарий выводит текст / html.

Что касается вышеизложенного предложения, вы должны сообщить браузеру, что вы выводите скрипт PHP: для меня это показалось необычной идеей. Я искал ее и обнаружил, что в Интернете довольно много обсуждений. По-видимому, есть случаи, когда вы можете сказать, что вы отправляете скрипт PHP (хотя Apache должен выполнять скрипт и испускать текст / html), а также есть случаи, когда браузер просто не распознает эту конкретную Mime Тип.

Очистка кеша браузера всегда хорошая идея.

В случае, если это полезно, вот копия моего файла /etc/httpd/conf.d/php.conf с сервера, на котором запущена CentOS 5.9:

# # PHP is an HTML-embedded scripting language which attempts to make it # easy for developers to write dynamically generated webpages. # LoadModule php5_module modules/libphp5.so LoadModule php5_module modules/libphp5-zts.so # # Cause the PHP interpreter to handle files with a .php extension. # AddHandler php5-script .php AddType text/html .php # # Add index.php to the list of files that will be served as directory # indexes. # DirectoryIndex index.php # # Uncomment the following line to allow PHP to pretty-print .phps # files as PHP source code: # #AddType application/x-httpd-php-source .phps 

Это может происходить из-за недостающих модулей, необходимых для вашего php. Предполагая, что у вас установлен php7, найдите доступные модули php7, используя

sudo apt-cache search php7-* 

Команда Above отобразит все доступные модули PHP7 для установки. Вы можете начать установку модулей, таких как,

sudo apt-get install libapache2-mod-php7.0 php7.0-mysql php7.0-curl php7.0-json 

У меня такая же проблема. Apache не загружает php-файлы с определенного веб-сайта, просто скачал его. Я прочитал этот пост и ответы, и я видел, что у меня есть эта строка в последнем месте файла .htaccess:

AddHandler x-mapp-php5.5 .php 

Я прокомментировал это, и все работает нормально.

У меня была аналогичная проблема после обновления с 5.3 до 5.4. Но моя настройка выглядит немного по-другому, так как я запускаю Debian и использую fcgid для сервера PHP-страниц, а не модуль PHP5 apache / cgi. Поэтому после обновления я также установил php5_cgi, который столкнулся с моей установкой fcgid и больше не будет выполнять файлы PHP.

Мне пришлось отключить модуль Apache и перезапустить Apache

a2dismod php5_cgi /etc/init.d/apache2 restart 

После того как модуль php5_cgi был в стороне, fcgid снова смог обслуживать страницы PHP.

Если у вашего .htaccess есть что-то вроде этого … AddHandler application / x-httpd-php53 .php .php5 .php4 .php3, то прокомментируйте его и повторите попытку, обновив это сработало для меня …

У меня были подобные симптомы, но еще одно решение: в /etc/apache2/mods-enabled/php5.conf в комментарии был полезный совет, который я последовал:

# To re-enable php in user directories comment the following lines # (from to .) Do NOT set it to On as it # prevents .htaccess files from disabling it. 

Я провел два дня, отслеживая это, и узнал, что я помещал свои PHP-скрипты в неправильный каталог.

На моей стандартной установке Ubuntu я помещал скрипты в /var/www . Они должны были быть в /var/www/html .

Я только что начал работу с PHP, поэтому не знаю, связано ли мое решение с изменением версии.

это решило проблему для меня (у меня установлен php7):

sudo apt-get install libapache2-mod-php7.0

sudo service apache2 restart

У меня была эта проблема. Оказалось, что у меня установлены как nginx, так и apache и автоматически запускаются при загрузке. Проблема заключалась в том, что nginx сначала привязывался к порту http, что предотвращало запуск apache.

У меня была аналогичная проблема с OP при обновлении php5 из более старой версии, до версии 5.5.9, которая является версией, установленной с Mint 17.

Я запускаю настройку LAMP на машине в локальной сети, которую я использую для предварительного просмотра изменений на веб-сайтах, прежде чем я загружу эти изменения на реальный сервер. Поэтому я поддерживаю идеальное локальное зеркало фактического сайта.

После обновления файлы, которые запускаются и отображаются отлично на фактическом сайте, не будут отображаться или будут отображаться только на html на локальном компьютере. PHP не анализировался. Команда phpinfo () работала, поэтому я знал, что php работает иначе. В журнале не было ошибок. Просмотр источника страницы показал мне фактический код php.

Я создал страницу test.php, содержащую следующий код:

Если ни одно из вышеперечисленных работ не будет выполнено,

попробуйте прокомментировать строку

и перезапустите apache, используя

LoadModule php5_module libexec/apache/libphp5.so AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps 

У меня такая проблема. Вот как я его решаю. После установки Apache я установил PHP, используя эту команду.

sudo apt-get install php libapache2-mod-php 

он выполняется правильно, но я запрашиваю файл .php из Apache, он дает без выполнения PHP- скрипта.

Тогда я проверяю, что PHP включен.

$ cd /etc/apache2 $ ls -l mods-*/*php* 

но он не показал никаких результатов. Я проверяю установленные пакеты PHP.

$ dpkg -l | grep php| awk '' |tr "\n" " " 

Различные типы версий PHP, установленные на моем компьютере. Затем я удаляю некоторые пакеты PHP из моего предыдущего списка, используя apt-get purge .

sudo apt-get purge libapache2-mod-php7.0 php7.0 php7.0-cli php7.0-common php7.0-json 

Я переустанавливаю PHP

sudo apt-get install php libapache2-mod-php php-mcrypt php-mysql 

Убедитесь, что модуль PHP загружен

Перезапустить сервер Apache

$ sudo systemctl restart apache2 

Наконец, я проверяю процесс PHP на Apache

sudo vim /var/www/html/info.php 

Добавьте этот контент в info.php и сохраните.

он показывает правильно. Я думаю, это поможет любому.

Если у вашего .htaccess есть что-то вроде этого

AddType application/x-httpd-ea-php56 .php .php5 .phtm .html .htm 

Источник

Оцените статью