了解此重写规则以实现与Apache Multiviews相同的效果

时间:2014-08-08 02:33:51

标签: .htaccess mod-rewrite

这个重写规则在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上一样工作吗?

1 个答案:

答案 0 :(得分:1)

  

第一个RewriteCond系列,根据我的理解!。+ php *会阻止任何字符串在中间某处或可能在最后评估为true?这是为了什么目的?

这看起来不对。 !是否定(不是),.+是至少1个字符的任何内容。 php*表示“p”,然后是“h”,则表示0或更多“p”。你可能想要的只是:

RewriteCond %{REQUEST_URI} !\.php 
  

在第二条RewriteCond产品线上,$ 1参考是什么?它是RewriteRule行中的第一个括号吗?我认为参考文献只能引用“先前”定义的不是之后的内容吗?

是的,它引用了规则中的([^/]+)。 mod重写处理规则时实际发生的是它在RewriteRule 第一个中应用正则表达式模式,然后如果模式匹配,则检查每个RewriteCond的与规则相关联(这种方式更有效,因为如果规则的模式甚至不匹配,则无需检查所有条件。)

至于为什么它不起作用:

  1. 确保打开mod重写
  2. 确保您的htaccess文件所在的目录(或其父级)的server / vhost配置中设置了AllowOverride All或至少AllowOverride FileInfo
  3. 确保您的htaccess文件确实在应有的位置(看起来这样想要在文档根中)
  4. 确保您的htaccess文件正在被读取(在其中放入一些乱码并查看是否出现500服务器错误),如果没有,请检查您的[AccessFilename](http://httpd.apache.org/docs/current/mod/core.html#accessfilename)指令设置为什么。它应设置为.htaccess
  5. 检查错误日志