Я работаю на сайте, где я использую SSI для установки переменной на HTML-странице, которая анализируется, и переменная затем должна быть выбрана сценарием после mod_rewrite
переписать. Это работает в моей локальной настройке, но по какой-то причине этого не происходит на производственном сервере (оба являются apache 2.2.22). Вот соответствующие биты:
В perl
сценарий:
my $working = ($ENV{'HTTP_my_var'} || $ENV{'REDIRECT_HTTP_my_var'}) || "NO";
print "Content-type: text/html\n\n";
print "is it working? <b>$working</b>";
соответствующие строки из .htaccess
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ /$1.html [L]
RewriteRule ^my_tst$ /cgi-bin/my_tst.cgi [L]
HTML-файл:
<!--#set var="HTTP_my_var" value="YES" -->
<!--#include virtual="/cgi-bin/my_tst.cgi" -->
<br>
<!--#include virtual="/my_tst" -->
Это результат на моей локальной машине:
это работает? ДА
это работает? ДА
Но на рабочем сервере:
это работает? ДА
это работает? Нет
Сравнивая конфигурации серверов, единственное, что действительно приходит в голову, это то, что на рабочем сервере httpd -M
не перечисляет apreq_module (shared)
, а локальный сервер не перечисляет fcgid_module (shared)
(среди прочего). Может ли это быть из-за чего-то из этого? Что могло быть причиной этого странного несоответствия в поведении?
В случае необходимости упоминания, когда я делаю дамп %ENV
, никто из REDIRECT_ * переменные появляются на производственном сервере в части перезаписи (вторая include
директивы HTML), в то время как они работают на локальном сервере, и вывод директивы include без перезаписи.
Изменить: добавление другой переменной, HTTP_my_var2 который устанавливается в .htaccess через SetEnv
директива не имеет проблем, т. е. значение не удаляется при перезаписи.
Однако установка переменной с помощью SetEnvIf
вызывает проблему,
Edit1: Подтверждено, кажется, что между mod_suexec
, mod_rewrite
и mod_include
(так же как mod_setenvif
). Я успешно воспроизвел проблему локально, запустив ее с suexec
включен. Отключение suexec, закомментировав SuexecUserGroup
линия в VirtualHost
запись (и перезапуск сервера) дает желаемые результаты. Теперь исследуем возможные решения.
На самом деле это может быть ошибка в apache httpd.