我一直在试图弄清楚Mod_Rewrite中的这两行是做什么的,并希望得到一些帮助。提前谢谢。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.php
他们检查请求的 URI 是现有文件还是目录。前面的!
使条件"not",因此,请求不会映射到文件或目录。
请参阅mod_rewrite中的-f
和-d
说明
不是所有请求都映射到某个文件以便浏览器可以加载它吗?
不。请求可能是针对不存在的内容并被重写。例如,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
- 检查条件:/某些内容不存在
- 应用规则,URI 在 =/something.php
- 检查条件:/something.php 存在,不应用规则 URI
- 输入 = URI 输出 =/something.php,停止重写
- 否则,如果没有
!-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 错误