当使用允许限制访问URL与显式IP和SetEnvIf时,间歇403错误

我们在Solaris 10环境中运行Apache 2.2.22。

我们有一个特定的URL,我们想限制IP访问。 我们最近实施了一个CDN,现在又增加了一个复杂的问题,那就是请求显示来自的IP实际上是CDN服务器,而不是最终的最终用户。 在我们需要将CDN退出的情况下,我们要处理CDN正在转发请求的情况,或者最终客户端直接发送请求的情况。

CDN在HTTP报头中发送最终用户IP地址(对于这种情况,报头称为“用户IP”)。 这是我们已经到位的configuration:

SetEnvIf User-IP (\d+\.\d+\.\d+\.\d+) REAL_USER_IP=$1 SetEnvIf REAL_USER_IP "(10\.1\.2\.3|192\.168\..+)" access_allowed=1 <Location /uri/> Order deny,allow Allow from 10.1.2.3 192.168. allow from env=access_allowed Deny from all </Location> 

这似乎一次正常工作,但在某些时候,Web服务器开始向最终用户提供403错误 – 所以由于某种原因,它限制了访问。 奇怪的是,Web服务器的反弹似乎解决了这个问题,但只是一段时间 – 然后行为回来了。

值得注意的是,这个URL是通过mod_jk委托给JBoss服务器的。 然而,拒绝访问是; 证实是在Apache层,这个问题似乎只发生在服务器运行一段时间后。

这是解决我们问题的最终configuration:

 SetEnvIf User-IP (\d+\.\d+\.\d+\.\d+) REAL_USER_IP=$1 SetEnvIf Remote_Addr "(10\.1\.2\.3|192\.168\..+)" access_allowed=1 SetEnvIf REAL_USER_IP "(10\.1\.2\.3|192\.168\..+)" access_allowed=1 <Location /uri/> Order deny,allow Allow from env=access_allowed Deny from all </Location> 

它看起来像源IP的明确允许是问题,因为REAL_USER_IP可能是有效的,但显式允许与IP在其中失败。

我们现在基本上链接SetEnvIf语句,以确保如果Remote_Addr或REAL_USER_IP匹配我们的IP,并且仅允许环境variables,则设置环境variables“access_allowed”。