【问题标题】:Mason and Apache configuration, loading files that don't existMason 和 Apache 配置,加载不存在的文件
【发布时间】:2011-08-07 20:37:38
【问题描述】:

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

我有一个 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>

【问题讨论】:

    标签: perl apache configuration mason


    【解决方案1】:

    为什么网络服务器会自动运行

    1. 将 index 翻译成 index.html
    2. 仍然坚持对它进行特殊处理(它显然没有按应有的方式将其输入 PerlHandler)我真的不知道(也许答案在您的配置中的其他地方)。

    但是,您可以尝试将“index”(或者更确切地说是“^index”)添加到定义应将哪些文件发送到HTML::Mason::ApacheHandler 的正则表达式中。不过我承认它有点丑。

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

    【讨论】:

    • 嘿,谢谢你的回答,虽然我不想将每个文件都添加到正则表达式中(一旦我忘记添加不同的文件,这是一个安全漏洞)
    • 纯文本/文本的 mime 不会打扰我,因为它不应该首先加载它......网络服务器喜欢在后台添加它自己的“.html”或其他东西,因为它正在发生与目录中的每个文件...
    • 嗯,我想当我跳枪并提供上面的答案时,我太不耐烦了。 (我很想对自己的答案投反对票……)。只是为了了解您的 Web 服务器的行为:如果您调用文件 foo.html,当您提供 URL “bla.com/foo " ?
    • 如果你创建了一个名为“index”的文件(具有非常基本的 HTML 文档结构,仅用于测试您的 Web 浏览器是否检索并显示为 HTML 或纯文本)在同一目录中文件'index.html',如果你尝试访问“bla.com/index”会发生什么?此外,如果您删除“MultiViews”选项或将其替换为“-MultiViews”,然后尝试访问“bla.com/index”,会发生什么情况?我做了一些研究,如果您尝试访问的某些文件碰巧丢失,MultiViews 似乎会触发您尝试访问的文件的一些“幕后重命名”。
    【解决方案2】:

    大约一年后我偶然找到了答案,所以我想分享我的发现:

    问题是 Mason(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 中执行 /index (没有文件扩展名),它只是显示了代码......

    有趣 :) 但解决方案是将“Options FollowSymLinks MultiViews”更改为“Options FollowSymLinks -MultiViews”而不使用 MultiViews。

    在看到以下响应标头时找到了此解决方案:

    Content-Location    index.html
    Vary    negotiate
    

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

    谢谢, 瑞奇。

    【讨论】:

      猜你喜欢
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多