Apache:隐藏 404 管理区域,直到通过基本身份验证进行身份验证,然后允许访问

Apache:隐藏 404 管理区域,直到通过基本身份验证进行身份验证,然后允许访问

给定一个具有如下 URL 的行政区域:

wp-admin/
wp-admin/whatever
wp-admin/another-page
wp-adminsecretlogin

标准基本身份验证覆盖范围将在所有三个 URL 上提供用户名和密码提示,并在所有失败的身份验证尝试中返回 403。这是一个非常明显的信号,表明那里存在某些东西,因此是脚本/暴力访问的邀请。

我希望改为要求所有地方都进行基本身份验证,但如果未通过身份验证,则不提示输入用户名和密码,而是对除某个wp-adminsecretlogin/URL 之外的所有 URL 返回 404 未找到错误。在该个人到站点 URL 上,基本身份验证可以通过,并解锁其余的管理功能(尽管仍需要标准应用程序登录)。

我如何通过 apache .htaccess 或 .conf 指令来实现这一点?

答案1

假设您已经设置了某些内容来要求对所有目标 URL(wp-admin和秘密 URL)进行身份验证,请将其放入您的虚拟主机块中:

RewriteCond %{LA-U:REMOTE_USER} ^$
RewriteRule wp-admin/ - [R=404]

我还没有测试过,所以我不完全确定它是否能成功短路身份验证阶段通常会发回的 401 响应,但值得一试。

答案2

如果用户/密码不正确,基本身份验证配置将响应 401。403(在身份验证上下文中)保留给已认证用户没有访问权限(即你有两个用户,AuthUserFile但还有一个Require user1,并尝试使用用户2使用正确的密码进行访问)

deny from在没有正确配置 autoindex/directoryindex、指令、mod_rewrite 或 mod_security 禁止规则等的情况下尝试直接列出目录也会出现 403,所以这通常表示不了什么。

要求进行基本身份验证Location /wp-adminsecretlogin并拥有像 Shane 提供的 RewriteRule 可以起作用([R] 仅接受 30x 错误代码,因此它可能不会向浏览器正确返回 404,而是返回 301),但这在很大程度上取决于您的浏览器以及您如何浏览网页:

由于 Web 服务器仅需要在某个特定路径上进行身份验证,因此浏览器无法在之前未触发 401 响应的请求上显示基本身份验证标头,因此,如果浏览器的第一个请求是/adminsecretlogin,它可以工作(浏览器假定所有内容都会要求进行基本身份验证),但如果您之前尝试访问//wp-admin(浏览器没有返回 401 响应),则浏览器可能会“认为”其他上下文是公共的并且不会显示基本身份验证标头,因此重写规则将“拒绝”访问。

相关内容