Apache 从.htaccess重定向匹配中排除深层子目录

Apache 从.htaccess重定向匹配中排除深层子目录,apache,.htaccess,mod-rewrite,url-rewriting,Apache,.htaccess,Mod Rewrite,Url Rewriting,站点的.htaccess文件具有以下现有命令: RedirectMatch 404 /directory(/|$) 要使一个深子目录中的文件可访问,同时仍为目录下的所有其他文件返回404,则需要一个异常。可访问目录的路径为: /directory/sub/sub/sub/sub 如果我注释掉现有的RedirectMatch,那么子目录中的文件是可以访问的,但是/directory的所有其他内容也是可以访问的。我已尝试保留重定向匹配,并在.htaccess文件的顶部放置重写规则: Rewrit

站点的.htaccess文件具有以下现有命令:

RedirectMatch 404 /directory(/|$)
要使一个深子目录中的文件可访问,同时仍为目录下的所有其他文件返回404,则需要一个异常。可访问目录的路径为:

/directory/sub/sub/sub/sub
如果我注释掉现有的RedirectMatch,那么子目录中的文件是可以访问的,但是/directory的所有其他内容也是可以访问的。我已尝试保留重定向匹配,并在.htaccess文件的顶部放置重写规则:

RewriteRule ^/directory/sub/sub/sub/sub/ - [L]
我已尝试使用RewriteCond和RewriteRule替换重定向匹配:

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
)。另外,无需检查路径的结尾,因为您正在匹配
目录
和子目录中的所有内容(用于排除)。

谢谢Mike!这是一个很好的答案,完全符合我的需要。我会提高投票率,但这个账户没有必要的15分。