1

我一直试图弄清楚 Mod_Rewrite 中的这两行是做什么的,希望能得到一些帮助。提前致谢。

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

1 回答 1

4

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

请参阅 mod_rewrite 中的-f-d描述


不是所有请求都映射到某个文件以便浏览器加载它吗?

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


编辑:对于已编辑的问题

  • 两个条件:如果请求的 URI 没有映射到文件或目录,则应用以下规则。
  • 规则:无论请求是什么,并.php在末尾附加 a 。
  • 这背后的逻辑: mod_rewrite 循环,直到进入重写引擎的 URI 和从它出来的 URI 相同。如果不检查 URI 是否映射到物理文件或目录,则规则将循环:
    • URI in = /something
    • 检查条件:/某事不存在
    • 应用规则,URI in = /something.php
    • 检查条件:/something.php EXISTS,不应用规则
    • URI in = URI out = /something.php,停止重写
  • 否则,没有!-fand!-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 错误
于 2012-06-30T15:31:06.237 回答