(和< LocationMatch>)指令与URL路径匹配,而不是严格的文件系统路径,因此不一定建议使用它来控制访问(在服务器配置中).
如果您有权访问服务器配置,那么您只需使用相关的容器.
如果不在子目录中使用.htaccess,则可以使用mod_setenvif根据请求的URL有条件地设置环境变量,然后根据此env var进行阻止.
例如:
SetEnvIf Request_URI "^/subdirectory/.+\.php$" BLOCK
Order deny,allow
Deny from env=BLOCK
Require all granted
Require not env BLOCK
我颠倒了Order指令(Apache 2.2),否则,没有额外的Allow指令,一切都会被阻止.
Apache 2.4指令需要位于< RequireAll>内.容器,首先授予所有访问权限(否则一切都被阻止),然后在设置BLOCK env var时有条件地拒绝访问.你不能有一个否定的Require指令 – 隐含的< RequireAny>容器 – 因为它不会产生任何影响(实际上,这会导致500错误).
请注意,这会阻止URL,而不是严格的“文件”.它阻止看起来像/子目录中的.php文件的请求 – 无论它们是否实际存在为物理文件.
或者,您可以在根.htaccess文件的顶部使用mod_rewrite(Apache 2.2和2.4):
RewriteEngine On
RewriteRule ^subdirectory/.+\.php$- [F]
这只是阻止(403 Forbidden)在.php中以请求/子目录结尾的所有URL.如果您特别需要为映射到真实文件的URL返回403,那么您可以包含一个附加条件(尽管这可能不必要地浪费):
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^subdirectory/.+\.php$- [F]
如果您想要返回404,请将F更改为R = 404.