【问题标题】:How can I make the -f flag apply to directories with a trailing slash?如何使 -f 标志应用于带有斜杠的目录?
【发布时间】:2010-02-08 00:27:32
【问题描述】:

我正在构建一个具有相当复杂规则集的.htaccess 文件。

基本的重写规则之一是第一行:

如果请求的文件物理存在,不重写,停止处理规则。

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . - [L]

这很好用,但有一个例外:当我访问带有 斜杠 的目录时

www.example.com/directory/

directory 不会被识别为存在,而

www.example.com/directory

会的。

如何让 Apache 识别带有斜杠的现有目录?

背景信息,我已经添加斜杠到每个没有请求的请求(以满足/directory/directory/ 请求。

【问题讨论】:

  • 准确地说:/foobar/ 不是指名为 foobar 的目录,而是指目录 foobar 中的索引文档。如果请求/foobar/,Apache 正在执行子请求。只有/foobar 确实引用了名为 foobar 的目录。
  • @Gumbo 好点。所以我可能别无选择,只能在内部处理中剃掉尾部的斜线。会试试的。
  • 您可以使用 mod_rewrite 的日志记录功能(请参阅RewriteLogLevel)查看您的请求是如何处理的。

标签: apache .htaccess mod-rewrite


【解决方案1】:
RewriteCond %{REQUEST_FILENAME} -d

-d 代表目录。此外,根据Hidden features of mod_rewrite , [L] 指令在 .htacess 文件中不起作用,只要将它放在 apache conf 文件中即可。

如果你只是从以下开始:

RewriteEngine on
# Dont rewrite files or directories which actually exist
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

您可以避免重写任何现有文件或目录。您现有的规则说“如果这是一个真实文件,请继续”,而我的规则说“如果它不是真实文件且不是真实目录,请继续。”

【讨论】:

  • 太棒了,非常感谢。 [L] not working in .htaccess 也解释了很多。我暂时休息,明天测试一下。
  • 你能发布你的整个 .htaccess 吗?我发布的以RewriteEngine on 开头的第二组行正是我用来将任何不存在的文件或目录重定向到特定文件的行(使用未显示的重写规则)。