【问题标题】:What exactly does the Multiviews options in .htaccess?.htaccess 中的 Multiviews 选项到底是什么?
【发布时间】:2014-10-14 21:33:47
【问题描述】:

我一直在努力解决需要重写一段 URL 添加路径的访问规则。

RewriteRule ^(configuration/.+)$ application-server/$1 [L,NC,R=301,NE]

此规则仅导致我的 Joomla 网站上出现空白页,没有错误日志或消息。 奇怪的是,所有其他规则我都完美运行:

RewriteRule ^(log/.+)$ application-server/$1 [L,NC,R=301,NE]
RewriteRule ^(monitor/.+)$ application-server/$1 [L,NC,R=301,NE]

最后,我在论坛中找到了使用以下选项的建议:

Options -Multiviews

这实际上解决了问题,但是我想知道使用此选项时是否会对其他规则产生任何副作用。

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    这是关于 Apache 内容协商的。

    MultiViews 搜索是服务器进行隐式文件名模式匹配的地方,并从结果中进行选择。

    例如,如果您在根文件夹中有一个名为 configuration.php(或其他扩展名)的文件,并且您在 htaccess 中为名为 configuration/ 的虚拟文件夹设置了规则,那么您的规则就会有问题因为服务器会自动选择configuration.php(如果启用了MultiViews,大多数时候都是这种情况)。

    如果您想禁用该行为,您只需将其添加到您的 htaccess
    Options -MultiViews

    这样,现在将评估您的规则,因为内容协商已禁用。

    编辑

    在某些共享主机上,negotiation 模块可能未启用。那会给你一个500错误。为避免此错误,您可以默认将指令封装在 IfModule 块中。

    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>
    

    【讨论】:

    • 谢谢,我现在可以看到罪魁祸首了!那是因为 joomla 还有一个名为 configuration 的物理文件夹。
    • FWIW,Options -MultiViews 在未启用 mod_negotiation 时不会导致 500 错误。如果您尝试 enable MultiViews(未启用 mod_negotiation 时),它甚至不会导致 500 错误 - 什么时候应该这样做?然而,mod_negotiation 是一个“基础”模块——这意味着它是“默认编译并加载到服务器中的”,因此它很少不可用,即使在共享服务器上也是如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 2019-01-24
    • 2014-01-12
    • 1970-01-01
    • 2015-03-24
    • 2013-05-29
    相关资源
    最近更新 更多