.htaccess 无法访问除特定文件夹以外的所有文件夹

Do not have access to all folders except a specific folder by .htaccess

我有这个目录结构:

./project/
├── docs/
├── framework/
├── .git/
├── .gitignore
├── .htaccess
└── web/

地址: http://demo.example.com/projecthttp://project.demo.example.com

我的项目前端文件在web路径下
我想阻止对 web 文件夹以外的所有文件和文件夹的访问。
显然这应该由 .htaccess.
完成 最初有使用 DirectoryDirectoryMatch 的解决方案,但这些在 .hatccess 中是不允许的。所以我不得不使用 RewriteRule.
我也不希望它与 project 名称相关联。

我找到这个命令:

RewriteRule (docs|framework|\.git|\.gitignore|\.htaccess)(/.*)?$ - [F,NC]

这看起来不错。
Returns 403 Forbidden 用于列出的地址。它也适用于子文件夹。
但主要问题是文件夹可能会改变。所以我决定更改策略并将其称为除 web.
之外的所有文件夹 为此,我这样写:

RewriteRule (?!web)(/.*)?$ - [F,NC]

但这并没有涵盖所有情况。
事实上,它适合所有模式!

为了加快测试速度,您可以使用此 link or this example link

使用 Apache,您可以通过简单地在正则表达式(或表达式)前加上 !(感叹号)来否定它。

例如,要阻止每个 URL,但开始 /project/web/ 的除外,您可以在 /project/.htaccess 文件中使用以下内容:

RewriteRule !^web/ - [F]

如果 .htaccess 文件位于 /project 子目录中,则无需指定 project/ 前缀,因为 URL-path 与 [=22] 匹配=] pattern 是相对于 .htaccess 文件的位置。

这需要靠近 .htaccess 文件的顶部。


RewriteRule (?!web)(/.*)?$ - [F,NC]

或者,在正则表达式中使用否定前瞻(注意:Apache 使用 PCRE,而不是正则表达式的“Java 8”风格)。

您缺少字符串锚点的开头。但是斜杠将不匹配,因为 negative-lookahead 断言实际上不匹配任何东西(并且 RewriteRule 模式 匹配的 URL-path 不匹配以斜杠开头)。

您可以改用以下内容:

RewriteRule ^(?!web($|/)) - [F]

我们不需要实际匹配任何东西,正则表达式只需要“成功”即可触发指令并阻止请求。 For example


或者,您可以使用 mod_authz_core。例如:

# /project/.htaccess

# Block access to everything
Require all denied

/web 子目录中创建一个额外的访问文件:

# /project/web/.htaccess

# Allow access
Require all granted

或者,您可以使用 Apache <If> 表达式 (Apache 2.4) 在 /project/.htaccess 中完成这一切。虽然这变得有点复杂,因为它可以通过 project 子域 子目录访问,并且我们正在匹配整个 URL-path。例如:

# /project/.htaccess

# Block everything except the "/web" subdirectory
<If "%{REQUEST_URI} !~ m#^(/[^/]+)?/web($|/)#">
    Require all denied
</If>

运算符 !~ 与正则表达式不匹配。