Apache 仅扩展名需要基本身份验证
我们在云上有一些公共内容,我正试图使用Basic Auth阻止人们访问我们的非生产性网站,除非他们在我们的公司网络上 在我提交一个请求之前,一切都在运行,该请求只是一个扩展名,比如“/.js”Apache 仅扩展名需要基本身份验证,apache,.htaccess,authentication,Apache,.htaccess,Authentication,我们在云上有一些公共内容,我正试图使用Basic Auth阻止人们访问我们的非生产性网站,除非他们在我们的公司网络上 在我提交一个请求之前,一切都在运行,该请求只是一个扩展名,比如“/.js” $ wget https://test.domain.com/.js HTTP request sent, awaiting response... 401 Authorization Required Authorization failed. 如果添加文件名,则不会要求我进行身份验证。如果文件确实存
$ wget https://test.domain.com/.js
HTTP request sent, awaiting response... 401 Authorization Required
Authorization failed.
如果添加文件名,则不会要求我进行身份验证。如果文件确实存在,我会得到200分
$ wget https://test.domain.com/x.js
HTTP request sent, awaiting response... 404 Not Found
2014-05-29 16:59:35 ERROR 404: Not Found.
下面是基本的身份验证配置。它是文档根目录中的.htaccess目录
SetEnvIf HOST "^www.domain.com$" allowProduction
SetEnvIF X-Forwarded-For "123\.123\.123\.123" allowEmployee
AuthType Basic
AuthName "Authentication Required"
AuthUserFile /location/of/passwords/.htpasswd
Order Deny,Allow
Deny from all
Satisfy any
Require valid-user
Allow from env=allowProduction
Allow from env=allowEmployee
我修改了日志格式以显示X-Forwarded-For,因为Apache位于负载平衡器后面
123.123.123.123 test.domain.com - - [29/May/2014:16:54:48 -0400] "GET /.js HTTP/1.0" 401 497 "-" "Wget/1.12 (linux-gnu)"
123.123.123.123 test.domain.com - - [29/May/2014:16:59:35 -0400] "GET /x.js HTTP/1.0" 404 287 "-" "Wget/1.12 (linux-gnu)"
我甚至尝试根据请求URI添加一些规则。我尝试了一些带有或不带前导“/”的变体。他们都没有工作
SetEnvIf Request_URI "^/\..*$" allowJunk
然后添加了以下内容
Allow from env=allowJunk
我们确实有一个重写规则来禁止前导“.”的请求,但这是403而不是401。403是可以接受的,因为浏览器可以忽略它。401要求用户输入用户名和密码
RewriteRule "(^|/)\." - [F]
禁止请求的示例
$ wget https://test.domain.com/x/.js
HTTP request sent, awaiting response... 403 Forbidden
2014-05-29 17:04:18 ERROR 403: Forbidden.
简单的解决方案是不请求任何前导的“.”URL,但我们正在使用其他人的框架,并在某些浏览器上获得这些请求。为一小部分客户重写框架是不可取的。提示他们输入密码就更不可取了
有什么建议吗
谢谢,
Wes.您的问题是授权和重写的处理顺序,我假设–您的
重写规则
无法用前导点“捕获”资源,授权之前已经生效。(我打赌,如果您为这样的资源输入有效的身份验证凭据,那么您将从以后的重写中获得403?)作为一个快速修复,可以尝试将Require
指令放入Files
指令,这只针对不以开头的文件,我知道顺序,因为我尝试使用“重写”来设置环境变量。传递用户和密码不会导致403。我仍然不清楚的是setenif
失败的原因。仅将.js
更改为只转储phpinfo()
的PHP页面显示我正在匹配这两个setenif
。我没有访问httpd.conf的权限,所以可能我遗漏了什么。