.htaccess中的Multiviews选项究竟是什么?

use*_*073 37 .htaccess mod-rewrite

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

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

此规则仅在我的Joomla站点上导致空白页面,没有错误日志或消息.奇怪的是,我完成了所有其他规则:

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

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

Options -Multiviews
Run Code Online (Sandbox Code Playgroud)

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

Jus*_*man 60

这是关于Apache内容协商.

一个MultiViews搜索是服务器执行一个隐含的文件名模式匹配,并从结果之间选择.

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

如果要禁用该行为,只需在htaccess中添加它即可
Options -MultiViews

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

编辑

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

<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我现在可以看到罪魁祸首!那是因为joomla还有一个名为configuration的物理文件夹。 (2认同)
  • FWIW,当未启用mod_negotiation时,`Options -MultiViews`不会导致500错误。如果您尝试_enable_ MultiViews(未启用mod_negotiation时),甚至不会导致500错误-何时应该出现?但是,mod_negotiation是一个“基本”模块-这意味着它是“默认情况下已编译并加载到服务器中”,因此即使在共享服务器上也很少不可用。 (2认同)