我在使用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服务器会自动
- 将索引转换为index.html
- 仍然坚持特别对待它(它显然不把它馈送到PerlHandler,因为它应该)我真的不知道(也许答案是在你的配置的其他地方)。
然而,你可以作为一种工作,尝试添加'index'(或者更确切地说'^index')到regex中,该regex定义了应该分配给HTML::Mason::ApacheHandler
的文件。我承认它有点丑。
我是否正确,一旦你加载index
页面并得到逐字代码显示,一旦你检查出页面信息,编码是字面上的plain/text
?也许您需要配置一些mime设置,以确保没有后缀的文件(不以.html
等结尾的文件)根本不会发送到远程浏览器,即使是plain/text
?