理解.htacces文件中的RewriteCond

我在理解RewriteCond指令如何工作时遇到问题。 到目前为止,很明显,它与应用RewriteRule的string相比较。 我有这个文件:

<IfModule rewrite_module> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ app_dev.php </IfModule> 

这适用于我,但我不知道为什么它的作品。 到目前为止在RewriteCond指令我明白:

如果REQUEST_FILENAME的值不是硬盘中的文件,则允许使用规则

这是没有意义,因为app_dev.php替代后是硬盘中的文件。 无论如何,有人可以启发我这个问题? 弄清楚这是如何工作的,我有一个非常苛刻的时间。

如果你请求/styles/main.css那么这是文件系统上的一个文件,并且RewriteRule将不会被处理。 Apache只会简单的提供这个文件。

如果您请求/foo/bar并且不存在,那么RewriteRule将被处理,并且请求将变为/app_dev.php但是在重写之前,PHP仍然可以访问原始URL。 通过使用它,像symfony这样的框架可以为不同的URL提供不同的页面,即使PHP文件每次都是一样的。

这是实际文件系统上的实际文件path。

所以如果你的DocumentRoot/var/www并且你请求了/styles/main.css ,那么当在目录/ htaccess上下文中使用%{REQUEST_FILENAME}/var/www/styles/main.css – 而且!-f正在检查如果该文件存在,并让RewriteRule发生,如果它不存在。

请注意,它的行为有所不同,如果不在目录/ htaccess上下文中使用,则不会包含文档根目录,如文档中所述:

REQUEST_FILENAME

如果在引用REQUEST_FILENAME时服务器已经确定了该文件或脚本的完整本地文件系统path, 否则,如在虚拟主机上下文中使用时,与REQUEST_URI的值相同。