Конфигурация Mason и Apache, загрузка файлов, которые не существуют
У меня действительно странное поведение при использовании Мейсона, например:
у меня есть index.html
файл (который содержит теги масон, как <% $var %> hello
).
Когда я просматриваю http://bla.com/index.html
переменная переводится во время компиляции.
Но есть странное поведение, когда я просматриваю http://bla.com/index
,
Хотя нет файла под названием index
(только index.html
) это все еще загружает index.html
и весь код отображается как обычный текст, включая <% ... %>
!!!
Что я настроил неправильно?
это моя конфигурация Apache:
<VirtualHost *:80>
ServerAdmin webmaster@abc.com
ServerAlias abc.com www.abc.com
ServerName abc.com
DocumentRoot /var/www/abc.com
DirectoryIndex index.html
<Directory "/var/www/abc.com/">
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
SetHandler perl-script
PerlModule HTML::Mason::ApacheHandler
PerlSetVar MasonUseObjectFiles 1
<LocationMatch "(\.html|\.txt|\.pl|\.js)$">
SetHandler perl-script
PerlHandler HTML::Mason::ApacheHandler
</LocationMatch>
<LocationMatch "(\.m(html|txt|pl)|dhandler|autohandler)$">
SetHandler perl-script
PerlHandler Apache::Constants::NOT_FOUND
</LocationMatch>
2 ответа
Через год я случайно нашел ответ, поэтому я хотел поделиться своими выводами:
Проблема заключалась в том, что Мейсон (Perl) отображал сам код другого файла в Интернете вместо предоставления "404 файл не найден", и я понятия не имел, как его остановить. Например: при запросе индекса он показывает код index.html
Решение состоит в том, что в моей конфигурации Apache было следующее:
<Directory "/var/www/my_dir/">
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
Очевидно, "MultiViews" активируется через mod_negotiation.c, что заставляет сайт искать шаблон следующего наилучшего соответствия в случае, если файл не найден на сервере. (так с сайта www.site.com/index он нашел index.html)
Но поскольку в Apache нет конфигурации для выполнения / индексации в Mason ENV (без расширения файла), он просто отображал код...
Забавно:), но решение было изменить "Опции FollowSymLinks MultiViews" на "Опции FollowSymLinks -MultiViews" и не использовать MultiViews.
Нашел это решение, увидев следующие заголовки ответа:
Content-Location index.html
Vary negotiate
"MultiViews" не имеет для меня никакого значения, так как это была копия-вставка 5 лет назад, которую я просто перенес с одного веб-сервера на другой:)
Спасибо, Рики.
Почему веб-сервер автоматически
- переводит index в index.html
- все еще настаивает на том, чтобы относиться к нему специально (он, очевидно, не передает его в PerlHandler, как следует), я, честно говоря, не знаю (возможно, ответ находится в другом месте вашей конфигурации).
Тем не менее, вы можете в качестве обходного пути попытаться добавить 'index' (или, скорее, '^index') к регулярному выражению, определяющему, какие файлы следует отправлять HTML::Mason::ApacheHandler
, Я признаю, что это немного некрасиво.
Правильно ли я, что после загрузки index
страница и получить этот дословный код отображается, как только вы проверяете информацию о странице, кодировка буквально plain/text
? Возможно, вам нужно настроить некоторые параметры MIME, чтобы гарантировать, что файлы без суффиксов (файлы не заканчиваются на .html
и т.д.) вообще не отправляются в удаленный браузер, даже если plain/text
?