从 .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
和子目录(用于排除)中的所有内容。
该站点的 .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
和子目录(用于排除)中的所有内容。