这个重写规则在Litespeed服务器上运行良好,可以获得与Apache的Multiviews相同的结果
RewriteEngine On
RewriteCond %{REQUEST_URI} !.+php*
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^([^/]+)/?(.*)$ $1.php/$2 [L]
但有几点我不明白;
第一个RewriteCond行,根据我的理解!.+php*
会阻止任何字符串有" php"在中间或可能在最后的某个地方评估为真?这是什么目的?
在第二条RewriteCond产品线上,$ 1参考是什么?它是RewriteRule行中的第一个括号吗?我认为参考文献只能引用已定义的内容"之前"不是在它之后?
当我上传到运行Litespeed的实时服务器但在运行Apache的本地开发环境中失败时,此规则也正常工作?我在Apache中禁用了Multiviews,所以这个重写规则应该像在Litespeed上一样工作吗?
答案 0 :(得分:1)
第一个RewriteCond系列,根据我的理解!。+ php *会阻止任何字符串在中间某处或可能在最后评估为true?这是为了什么目的?
这看起来不对。 !
是否定(不是),.+
是至少1个字符的任何内容。 php*
表示“p”,然后是“h”,则表示0或更多“p”。你可能想要的只是:
RewriteCond %{REQUEST_URI} !\.php
在第二条RewriteCond产品线上,$ 1参考是什么?它是RewriteRule行中的第一个括号吗?我认为参考文献只能引用“先前”定义的不是之后的内容吗?
是的,它引用了规则中的([^/]+)
。 mod重写处理规则时实际发生的是它在RewriteRule
第一个中应用正则表达式模式,然后如果模式匹配,则检查每个RewriteCond
的与规则相关联(这种方式更有效,因为如果规则的模式甚至不匹配,则无需检查所有条件。)
至于为什么它不起作用:
AllowOverride All
或至少AllowOverride FileInfo
[AccessFilename](http://httpd.apache.org/docs/current/mod/core.html#accessfilename)
指令设置为什么。它应设置为.htaccess