Mason 和 Apache 配置,加载不存在的文件



我在使用Mason时有一个非常奇怪的行为,例如:

我有一个index.html文件(包含像<% $var %> hello这样的mason标签)。

当我浏览到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>

一年后,我意外地找到了答案,所以我想分享我的发现:

问题是Mason(Perl)在web上显示另一个文件的代码本身,而不是提供"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中执行/index(没有文件扩展名),所以它只是显示代码…

有趣:)但解决方案是改变"选项FollowSymLinks MultiViews"到"选项FollowSymLinks -MultiViews",而不是使用MultiViews。

找到这个解决方案,同时看到以下响应头:

Content-Location    index.html
Vary    negotiate

"MultiViews"对我来说没有任何意义,因为它是5年前的复制粘贴,我只是从一个web服务器转移到另一个服务器:)

谢谢,瑞奇。

为什么web服务器会自动

  1. 将索引转换为index.html
  2. 仍然坚持特别对待它(它显然不把它馈送到PerlHandler,因为它应该)我真的不知道(也许答案是在你的配置的其他地方)。

然而,你可以作为一种工作,尝试添加'index'(或者更确切地说'^index')到regex中,该regex定义了应该分配给HTML::Mason::ApacheHandler的文件。我承认它有点丑。

我是否正确,一旦你加载index页面并得到逐字代码显示,一旦你检查出页面信息,编码是字面上的plain/text ?也许您需要配置一些mime设置,以确保没有后缀的文件(不以.html等结尾的文件)根本不会发送到远程浏览器,即使是plain/text ?

相关内容

  • 没有找到相关文章

最新更新