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

给定一个像这样的URL的行政区域:

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

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

我想反而需要基本的身份validation无处不在,但是当未经过身份validation,不提示input用户名和密码,而是返回一个404找不到所有的URL错误,除了一个wp-adminsecretlogin/ url。 在个人到站点的URL中,基本的身份validation可以通过,并解锁其余的pipe理function(虽然标准的应用程序login仍然是必要的)。

我将如何通过Apache .htaccess或.conf指令来做到这一点?

假设您已经设置了一些要求在所有目标URL(包括wp-admin和秘密URL)上的身份validation,请将其放在您的虚拟主机块中:

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

我还没有testing过,所以我不能完全确定它是否能够成功地将authentication阶段通常发回的401响应短路,但是值得一试。

如果用户/密码不正确,基本身份validationconfiguration会以401响应。 403(在authentication上下文中)被保留给没有访问权限的authentication用户 (即你在AuthUserFile上有两个用户,但是也是一个Require user1并尝试用user2以正确的密码访问)

当试图直接列出目录而没有正确configurationautoindex / directoryindex, deny from指令,通过mod_rewrite或mod_security deny from规则等等时也会出现403,所以它通常表示不多。

要求对Location /wp-adminsecretlogin进行基本validation,并且像Shane提供的RewriteRule一样可以工作([R]只接受30x错误代码,所以它不能正确返回404到浏览器,而是301)很大程度上取决于您的浏览器以及您如何浏览网页:

由于Web服务器仅需要在特定path上进行身份validation,因此浏览器无法在以前未触发401响应的请求上显示基本身份validation标头,因此如果来自浏览器的第一个请求是/adminsecretlogin ,则可能会起作用(浏览器假定一切都会要求基本的authentication),但如果你以前试图访问//wp-admin (没有401回应浏览器),浏览器可以“认为”其他上下文是公开的而不是基本的auth头,所以重写将会“拒绝”访问。