如何在禁止文件上正确应用 RewriteRule?

Posted

技术标签:

【中文标题】如何在禁止文件上正确应用 RewriteRule?【英文标题】:How to apply RewriteRule properly on forbidden files? 【发布时间】:2021-05-27 15:13:22 【问题描述】:

目标

如果请求是http://⋯/.htaccess,显示该文件的内容, 改为显示 ErrorDocument 403, 重写 http:// to https://

问题

网址改写为https://⋯/403.shtml, 而不是 the desired https://⋯/.htaccess

详情

ErrorDocument 403 及其保护 .htaccess 由网络托管服务提供商设置。

HTTPS 重写在 .htaccess 文件中设置:

RewriteEngine on
RewriteCond %HTTPS !on
RewriteRule .* https://%HTTP_HOST/$0 [L,QSA,R=301]

【问题讨论】:

如果 ErrorDocument 403 "Forbidden" 附加到 .htaccess 文件,则根本不会重写 URL。它仍然是http://⋯/.htaccess,而不是所需的https://⋯/.htaccess http://⋯/non-existent 被正确地重写为https://⋯/non-existent,不管ErrorDocument 404 的类型(无论是自定义消息还是内部重定向)。所以我猜罪魁祸首不是 ErrorDocument 指令,而是主配置文件中假定的 Require all denied 指令,保护 .htaccess 文件。 http://⋯/.htaccess 应该只返回 403 对于 403 状态 URL,不会重定向到 https @anubhava 我希望本网站的所有页面都使用 HTTPS 提供服务,包括错误页面。我不希望用户认为该网站(部分)不安全。 服务器配置中的ErrorDocument 403 是什么? 【参考方案1】:

.htaccess 文件中设置以下内容以重置默认 403 Apache ErrorDocument

ErrorDocument 403 default

ErrorDocument 403 和 .htaccess 的保护由网络托管服务提供商设置。

看来主机配置了ErrorDocument 指令和403.shtml 文档的绝对URL,这自然会触发302 重定向而不是内部子请求。

【讨论】:

我已将其设置为默认值。现在我收到简单的硬编码错误消息“Forbidden You don't have permission to access this resource.”。不幸的是,URL 仍然是http://⋯/.htaccess 而不是https://⋯/.htaccess。我认为外部重定向由主配置文件中假定的 Require all denied 指令修改,保护 .htaccess 文件。 “不幸的是,URL 仍然是 http” - 是的,这真的有问题吗?但它是 403,而不是 302(就像我之前假设的那样)。发出 3xx 重定向并不能提供更好的安全性。如果您需要更高的安全性,请考虑实施 HSTS(因此 浏览器 从一开始就请求 HTTPS - 无重定向)。在.htaccess 能够运行之前,该请求在服务器配置中被阻止。 在发出 403 之前 重定向到 HTTPS不是更好。您应该在 HTTP 请求上以 403 响应(这就是现在可以)。您在这里遇到的“问题”是外部重定向到403.shtml 不使用HTTPS是否仍然安全,如果动态生成403错误页面,包含用户的姓名和头像,以及一些个性化的导航链接,基于用户的站点浏览历史? 其他被服务器配置阻止的系统文件或阻止的文件?但是有了ErrorDocument 403 default,你就会得到一个简单的直接响应——这很好。然后您可以使用自定义 403(您似乎正在这样做)覆盖它,您可以在其中检查 URL 路径并根据已请求的 URL 返回自定义响应。如果您愿意,您的自定义 403 还可以触发 302 重定向到 HTTPS(对于包含更多个人信息的选择 URL)。但是,如果安全确实是一个问题,那么请考虑实施 HSTS。【参考方案2】:
<If "%HTTPS != 'on'">
    Require all granted
    RewriteEngine on    
    RewriteRule .* https://%HTTP_HOST%REQUEST_URI [L,QSA,R=301]
</If>

【讨论】:

虽然此代码可能会为问题提供解决方案,但最好添加有关其工作原理/方式的上下文。这可以帮助未来的用户学习并最终将这些知识应用到他们自己的代码中。解释代码时,您也可能会得到用户的积极反馈/赞成。 不错的解决方案(+1)。 &lt;If&gt; 表达式更改了处理顺序,以便它可以覆盖服务器配置中生成的 403 响应。但是,您仍然需要确保 ErrorDocument 不是 重定向403.shtml 文档,如我的回答中所述,否则您将获得 301,然后是 302(并且可能根本没有 403)。 但是,我仍然会质疑您是否应该对系统文件的潜在“恶意”请求执行此操作(例如问题中提到的.htaccess 本身)。在这种情况下,最好使用最小的 403 响应(无重定向) - 无论请求是 HTTP 还是 HTTPS,而不是 301(通过 HTTP),然后是 403(通过 HTTPS)。您的 应用程序 生成的任何 403 都应该在重定向到 HTTPS 之后。

以上是关于如何在禁止文件上正确应用 RewriteRule?的主要内容,如果未能解决你的问题,请参考以下文章

自定义 403 禁止使用重写条件

禁止您无权访问/在此服务器上[关闭]

强制 RewriteRule 在 htaccess 文件中结束处理/循环

转载 .htaccess文件RewriteRule语法规则

Apache 在 htaccess 禁止访问 和 conf 中的 禁止访问 区别

禁止访问目录,但不禁止别名?