我们在云上有一些公开内容,我正在尝试使用Basic Auth阻止人们访问我们的非生产网站,除非他们在我们的公司网络上。
一切正常,直到我提交的请求只是一个扩展名,例如'/.js'。
$ 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.
这是Basic Auth配置。它是文档根目录中的.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,但我们正在使用其他人的框架,我们在某些浏览器上收到这些请求。为一小部分客户重写框架是不可取的。提示他们输入密码是不太可取的。
有什么建议吗?
谢谢, 韦斯。