Apache не будет устанавливать заголовки для скрипта PHP

Этот .htaccess файл:

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 4 month"
</IfModule>
<IfModule mod_headers.c>
    Header merge X-ModHeaders "Yes, it is installed"
</IfModule>

... работает, как и ожидалось, в моем поле разработки (окно Windows, Apache/2.4.10, PHP работает как модуль Apache), где «работает» означает, что он генерирует соответствующие заголовки для всех ресурсов (статических или динамических).

Однако на моем производственном сервере (Linux box, Apache/2.2.31, PHP работает как FastCGI с mod_fcgid/2.3.9) он работает только для статических ресурсов, а не для PHP-скриптов.

Правильно ли я подозреваю, что разница исходит из PHP SAPI? Есть ли способ исправить это, чтобы мне не нужно было дублировать код, генерирующий заголовки HTTP?


person Álvaro González    schedule 21.08.2015    source источник
comment
PHP может редактировать заголовки, но это не значит, что он будет делать это по умолчанию. Вы все равно должны получить их в любом случае   -  person Machavity♦    schedule 21.08.2015
comment
Подумайте, что здесь применим ответ: serverfault.com/questions/383011/ ... не копался слишком глубоко, но прочитал те отчеты об ошибках, на которые он ссылается.   -  person ficuscr    schedule 21.08.2015
comment
Ваша производственная коробка находится на виртуальном хостинге? Это может помешать вам изменить некоторые модули Apache...   -  person Luc Laverdure    schedule 21.08.2015
comment
@ficuscr Это, безусловно, моя проблема, но пока единственный ответ утверждает, что это не ошибка, и ссылается на билет, в котором говорится о чем-то другом. Юк..   -  person Álvaro González    schedule 21.08.2015
comment
@LucLaverdure - Да, это виртуальный хостинг. Что именно я смог бы изменить, если бы это был выделенный сервер?   -  person Álvaro González    schedule 21.08.2015
comment
На выделенном можно было бы все поменять, какой у вас виртуальный хостинг? Могут быть решения, которые ищут что-то конкретное для этого хостинг-провайдера.   -  person Luc Laverdure    schedule 21.08.2015
comment
Может быть, Header always merge X-ModHeaders "Yes, it is installed"?   -  person bishop    schedule 21.08.2015
comment
@bishop Извините, я пробовал все варианты, и это не так. Если модуль генерирует какой-либо вывод, он просто уничтожается.   -  person Álvaro González    schedule 22.08.2015


Ответы (1)


Если PHP работает через mod_proxy_fcgi, каталог файловой системы может не использоваться, поэтому поиск htaccess невозможен.

Существует более поздняя разновидность php+mod_proxy_fcgi, которая теперь задокументирована в руководстве и использует SetHandler вместо ProxyPass, что позволяет обрабатывать такие вещи, как htaccess, поскольку ядро ​​фактически ищет URL-адрес в файловой системе в качестве первого шага.

person covener    schedule 21.08.2015
comment
Сервер использует mod_fcgid/2.3.9, и .htaccess определенно выполняется, поскольку другие модули работают должным образом (например, mod_rewrite или директива AddHandler для выбора версии PHP), а недопустимые директивы вызывают ответ Status 500. - person Álvaro González; 22.08.2015
comment
Кстати, я обновил вопрос с фактическим обработчиком CGI, который я использую (это был не mod_fastcgi, а mod_fcgid, мой плохой) - person Álvaro González; 22.08.2015
comment
Для меня это было причиной: я переключился на модуль PHP на своем виртуальном хостере, и тогда Header set заработало. - person Andy; 24.07.2017
comment
В конце концов я получил подтверждение от службы поддержки HSP, что их установка mod_fcgid помешала работе пользовательских заголовков, установленных в .htaccess. (Ужасно извиняюсь, что не отчитался тогда!) - person Álvaro González; 30.03.2018
comment
@ ÁlvaroGonzález, у вас есть больше информации об этом, пожалуйста? Вы знаете, что именно они исправили? Я имею ту же самую проблему... - person Adrian Föder; 14.11.2018
comment
@AdrianFöder Насколько я знаю, они ничего не исправили. Конкретные настройки моего хостинг-провайдера не позволяют этим директивам влиять на файлы, которые они обрабатывают. Но поскольку проблема затрагивает только файлы PHP, написать обходной путь PHP с помощью header() несложно. - person Álvaro González; 14.11.2018