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

时间:2015-06-07 23:31:13

标签: apache .htaccess mod-rewrite url-rewriting

网站的.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]

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

1 个答案:

答案 0 :(得分:1)

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

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

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