Конфигурация 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 лет назад, которую я просто перенес с одного веб-сервера на другой:)

Спасибо, Рики.

Почему веб-сервер автоматически

  1. переводит index в index.html
  2. все еще настаивает на том, чтобы относиться к нему специально (он, очевидно, не передает его в PerlHandler, как следует), я, честно говоря, не знаю (возможно, ответ находится в другом месте вашей конфигурации).

Тем не менее, вы можете в качестве обходного пути попытаться добавить 'index' (или, скорее, '^index') к регулярному выражению, определяющему, какие файлы следует отправлять HTML::Mason::ApacheHandler, Я признаю, что это немного некрасиво.

Правильно ли я, что после загрузки index страница и получить этот дословный код отображается, как только вы проверяете информацию о странице, кодировка буквально plain/text? Возможно, вам нужно настроить некоторые параметры MIME, чтобы гарантировать, что файлы без суффиксов (файлы не заканчиваются на .html и т.д.) вообще не отправляются в удаленный браузер, даже если plain/text?

Другие вопросы по тегам