.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/project
或 http://project.demo.example.com
我的项目前端文件在web
路径下
我想阻止对 web
文件夹以外的所有文件和文件夹的访问。
显然这应该由 .htaccess
.
完成
最初有使用 Directory
或 DirectoryMatch
的解决方案,但这些在 .hatccess
中是不允许的。所以我不得不使用 RewriteRule
.
我也不希望它与 project
名称相关联。
我找到这个命令:
RewriteRule (docs|framework|\.git|\.gitignore|\.htaccess)(/.*)?$ - [F,NC]
这看起来不错。
Returns 403 Forbidden
用于列出的地址。它也适用于子文件夹。
但主要问题是文件夹可能会改变。所以我决定更改策略并将其称为除 web
.
之外的所有文件夹
为此,我这样写:
RewriteRule (?!web)(/.*)?$ - [F,NC]
但这并没有涵盖所有情况。
事实上,它适合所有模式!
使用 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>
运算符 !~
与正则表达式不匹配。
我有这个目录结构:
./project/
├── docs/
├── framework/
├── .git/
├── .gitignore
├── .htaccess
└── web/
地址:
http://demo.example.com/project
或 http://project.demo.example.com
我的项目前端文件在web
路径下
我想阻止对 web
文件夹以外的所有文件和文件夹的访问。
显然这应该由 .htaccess
.
完成
最初有使用 Directory
或 DirectoryMatch
的解决方案,但这些在 .hatccess
中是不允许的。所以我不得不使用 RewriteRule
.
我也不希望它与 project
名称相关联。
我找到这个命令:
RewriteRule (docs|framework|\.git|\.gitignore|\.htaccess)(/.*)?$ - [F,NC]
这看起来不错。
Returns 403 Forbidden
用于列出的地址。它也适用于子文件夹。
但主要问题是文件夹可能会改变。所以我决定更改策略并将其称为除 web
.
之外的所有文件夹
为此,我这样写:
RewriteRule (?!web)(/.*)?$ - [F,NC]
但这并没有涵盖所有情况。
事实上,它适合所有模式!
使用 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>
运算符 !~
与正则表达式不匹配。