Mod_Rewrite的这两行有什么作用


What do these Two Lines in Mod_Rewrite do?

我一直在试图弄清楚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 错误