仅当目录或文件不存在时才重写规则

Posted

技术标签:

【中文标题】仅当目录或文件不存在时才重写规则【英文标题】:RewriteRule only if directory or file does not exists 【发布时间】:2012-07-23 17:24:11 【问题描述】:

我正在尝试使用 php 和 .htaccess 创建一个 url 处理程序,我的问题是我不知道如何仅在 url 中输入的文件\目录不存在时使用重写条件。

【问题讨论】:

你有没有尝试搜索过? 嗯,我确实搜索过。 【参考方案1】:

它与 shell 脚本的 -d 和 -f 函数非常相似。

试试这样的:

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule XXX

【讨论】:

表示:如果请求的文件名 是一个存在的文件 AND 是一个存在的目录【参考方案2】:

请查看此RewriteCond 资源。

RewriteCond %REQUEST_FILENAME !-f
//                                ^ this means file.
RewriteCond %REQUEST_FILENAME !-d
//                              ^ this means NOT, "d" means directory.
// Your rewrite rule here.

【讨论】:

请注意,这仅适用于 <Directory> 块或 .htaccess 文件,不适用于 <VirtualHost> 或根配置上下文,其中 REQUEST_FILENAME 尚未完成完整路径 (因为不知道)。在这些上下文中,必须手动将部分路径添加到测试中,因为 REQUEST_FILENAME 将与 REQUEST_URI 相同。【参考方案3】:

'-d' (is directory) 将 TestString 视为路径名并进行测试 是否存在,是否为目录。

'-f'(是常规文件)将 TestString 视为路径名并进行测试 是否存在,是否为普通文件。

以感叹号 ('!') 为前缀以否定它们的含义。

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d

【讨论】:

【参考方案4】:

应该这样做(替换<filename>):

RewriteEngine On

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-l

RewriteRule .* <filename> [L]

如果文件、目录或链接不存在,它会进行重定向。

【讨论】:

以上是关于仅当目录或文件不存在时才重写规则的主要内容,如果未能解决你的问题,请参考以下文章

仅当存在集合类而不是其他类时才应用 CSS 规则 [重复]

MongoDB + Mongoose:仅当给定键不存在或具有虚假值时才设置

仅当文件尚不存在时才将行附加到文件中

PL/SQL - 仅当记录不存在时才插入记录

仅当列存在时才适用于数据框列表

SaltStack:仅当目录存在时才使用目录作为源