【问题标题】:Do not have access to all folders except a specific folder by .htaccess除了 .htaccess 的特定文件夹外,无权访问所有文件夹
【发布时间】:2022-01-22 08:40:30
【问题描述】:

我有这个目录结构:

./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]

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

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

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

为了更快的测试,您可以使用此link 或此示例link

【问题讨论】:

  • 也许^(?!(?:.*/)?web)(.*) 可以。
  • 请注意,您链接到的“MWL htaccess 测试器”假定 .htaccess 文件位于文档根目录中,而不是在您在此处使用的子目录中(这可能是您'已经从你的正则表达式中省略了字符串锚的开始?)。
  • 感谢所有评论和回复的朋友。我用另一种方式解决了这个问题。我在项目前级别定义了这样的规则,demo 目录:RewriteEngine On Options -Indexes RewriteRule ^(project1|project2|project3)(/.*)?$ - [F,NC] 这允许项目只能通过指向主web 目录的子域访问。

标签: regex apache .htaccess mod-rewrite


【解决方案1】:

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

例如,要阻止除以 /project/web/ 开头的所有 URL,您可以在 /project/.htaccess 文件中使用以下内容:

RewriteRule !^web/ - [F]

如果.htaccess 文件位于/project 子目录中,则无需指定project/ 前缀,因为RewriteRule 匹配的URL 路径是相对的模式.htaccess 文件的位置。

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


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

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

您缺少字符串锚点的开头。但是斜杠将不匹配,因为负前瞻断言实际上不匹配任何内容(并且RewriteRule pattern 匹配的 URL 路径不以斜杠开头)。

您可以改用以下内容:

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 路径。例如:

# /project/.htaccess

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

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

【讨论】:

    猜你喜欢
    • 2012-12-15
    • 2013-07-25
    • 1970-01-01
    • 2012-08-22
    • 2013-10-03
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    相关资源
    最近更新 更多