我无法理解 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 的值相同。