我试图configuration一个URLscheme,a)允许“.html”扩展名被省略,b)在某些条件下发送403(禁止)错误。 但是,通过以下设置:
Options +MultiViews RewriteRule ^foo/bar$ - [F]
如果我请求/foo/bar我得到一个404(未发现)错误与错误日志中的“无法协商”行。 请求/foo/bar.html 确实起作用,所以我猜测内容协商正在对RewriteRule进行“优先处理”,并且一直在寻找其他的URL,直到find200.事实上,我已经证实通过bar.txt文件和只针对.html文件的RewriteRule进行testing。
那么,有没有办法修改mod_negotiation的行为,只要遇到Forbidden错误就“放弃”?
UPDATE
注:看起来好像我可以解决这个问题,通过禁用MultiViews和使用mod_rewrite,而不是例如
RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L]
但我猜测效率不高,而且configuration要多得多
基于你从^foo省略了前导斜杠的事实,我猜测这是在<Directory>块或htaccess文件中configuration的?
这实际上是这个问题的原因。 在这种情况下,重写规则在请求被映射到文件系统之后被应用(并且.html被固定)。
从文档 :
在VirtualHost上下文中,模式最初将与主机名和端口之后以及查询string(例如“/app1/index.html”)之前的URL部分相匹配。
在目录和htaccess上下文中,模式最初将与文件系统path相匹配,在删除导致服务器到当前RewriteRule的前缀(例如“app1 / index.html”或“index.html”,取决于指令的位置定义)。
将你的RewriteRuleconfiguration移动到<VirtualHost>上下文(并相应地修改你的匹配,从^foo/bar$到^/foo/bar$ ),它应该按照预期工作。