Mod_Rewrite中的这两行有什么作用?

时间:2012-06-30 15:29:28

标签: php apache .htaccess mod-rewrite

我一直试图找出Mod_Rewrite中这两行的内容,并希望得到一些帮助。提前谢谢。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.php

1 个答案:

答案 0 :(得分:4)

他们检查请求的URI是现有文件还是目录。前面的!使条件“不”,因此,请求不会映射到文件或目录。

请参阅-f and -d description in mod_rewrite


  

请勿将所有请求映射到某个文件以便浏览器加载它们吗?

没有。请求可能是针对不存在并被重写的内容。例如,http://en.wikipedia.org/wiki/something表示URI为/wiki/something,不会映射到任何物理文件或目录。但在内部,有一条规则会将/wiki/something重写为index.php?title=something,而index.php 会重复


编辑:针对已修改的问题

  • 2个条件:如果请求的URI未映射到文件或目录,请应用以下规则。
  • 规则:接受请求,并将.php附加到最后。
  • 这背后的逻辑:mod_rewrite循环,直到进入重写引擎的URI和从它出来的URI是相同的。如果没有检查URI是否映射到物理文件或目录,规则将循环:
    • URI in = / something
    • 检查条件:/某些东西不存在
    • 在= /something.php
    • 中应用规则,URI
    • 检查条件:/something.php EXISTS,不应用规则
    • URI in = URI out = /something.php,stop rewriting
  • 否则,不进行!-f!-d检查:
    • URI in = / something
    • 应用规则,URI = /something.php
    • URI in = /something.php
    • 应用规则,URI = /something.php.php
    • URI in = /something.php.php
    • 应用规则,URI = /something.php.php.php
    • 无限循环直到apache决定停止并返回500错误