了解 .htacces 文件中的 RewriteCond

了解 .htacces 文件中的 RewriteCond

我无法理解 RewriteCond 指令的工作原理。到目前为止,很明显它会与字符串进行比较以应用 RewriteRule。我有这个文件:

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

这对我来说有效,但我不知道为什么它有效。到目前为止,在 RewriteCond 指令中我理解:

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

这毫无意义,因为替换后的 app_dev.php 是硬盘中的一个文件。无论如何,有人能帮我解决这个问题吗?我花了很长时间才弄清楚这是怎么回事。

答案1

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

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

答案2

这是您实际文件系统上的实际文件路径。

因此,如果您的DocumentRoot/var/www并且您请求/styles/main.css,那么在目录/htaccess 上下文中使用时%{REQUEST_FILENAME}/var/www/styles/main.css- 并且是检查该文件是否存在,如果不存在则!-f让其发生。RewriteRule

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

请求文件名

与请求匹配的文件或脚本的完整本地文件系统路径(如果在引用 REQUEST_FILENAME 时服务器已确定此路径)。否则,例如在虚拟主机上下文中使用时,与 REQUEST_URI 的值相同。

相关内容