从 .htaccess RedirectMatch 中排除深层子目录

Exclude a deep subdirectory from an .htaccess RedirectMatch

该站点的 .htaccess 文件有这个现有命令:

RedirectMatch 404 /directory(/|$)

需要一个异常才能使来自一个深层子目录的文件可访问,同时仍然为目录下的所有其他文件返回 404。可访问目录的路径为:

/directory/sub/sub/sub/sub

如果我注释掉现有的RedirectMatch,子目录中的文件是可以访问的,但是/directory 的所有其他内容也是如此。我尝试保留 RedirectMatch 并将 RewriteRule 放在 .htaccess 文件的顶部:

RewriteRule ^/directory/sub/sub/sub/sub/ - [L]

我尝试用 RewriteCond 和 RewriteRule 替换 RedirectMatch:

RewriteCond %{REQUEST_URI} ^/directory/ 
RewriteCond %{REQUEST_URI} !^/directory/sub/sub/sub/sub/.*$
RewriteRule ^/directory/(.*)$ - [L,R=404]

到目前为止没有任何效果。有什么指点吗?

您可以使用否定前瞻来排除子目录,如下所示:

 RedirectMatch 404 /directory(?!/sub/sub/sub/sub)

您还会注意到我已经删除了对字符串尾部斜杠 结尾的检查。原因是:目录总是有尾部斜杠(除非 DirectorySlash 设置为 off)。此外,无需检查路径的结尾,因为您正在匹配 directory 和子目录(用于排除)中的所有内容。