.htaccess RewriteCond for REMOTE_ADDR在Load Balancer后面?

我有一个负载均衡器后面的Web服务器。

我需要添加一个条件redirect到我的.htaccess为了显示一个维护页面,每当我们把网站离线维护。 这部分很简单:

RewriteEngine on RewriteCond %{REQUEST_URI} !/maintenance.php$ [NC] RewriteCond %{REQUEST_URI} !\.(jpe?g?|png|gif) [NC] RewriteRule .* /maintenance.php [R=302,L] 

不过,我想补充一个条件,如果访问者的IP地址是我自己的,它不会将我redirect到维护页面,我将能够看到和testing站点,就好像它在线。 这部分通常也是直截了当的:

 RewriteEngine on RewriteCond %{REMOTE_ADDR} !^11\.111\.111\.111 RewriteCond %{REQUEST_URI} !/maintenance.php$ [NC] RewriteCond %{REQUEST_URI} !\.(jpe?g?|png|gif) [NC] RewriteRule .* /maintenance.php [R=302,L] 

但是,由于我的Web服务器位于负载平衡器的后面,因此REMOTE_ADDR将parsing为Load Balance服务器的内部IP地址。

我怎样才能改变这个查找转发的IP地址? 我知道在PHP中可以使用$_SERVER['HTTP_X_FORWARDED_FOR']来获得转发的IP地址。 我已经在.htaccess尝试了一些东西,但没有运气:

 %{X_FORWARDED_FOR} %{HTTP:X_FORWARDED_FOR} %{HTTP_X_FORWARDED_FOR} 

我有以下工作:

 %{HTTP:X-FORWARDED-FOR} 

使用%{HTTP:X-FORWARDED-FOR}而不是%{REMOTE_ADDR}

你需要mod_rpaf 。 这个模块会用另外一个头来重写apache的REMOTE_ADDR,比如x-forwarded-for。 对于使PHP应用程序具有负载平衡器的行为非常有用。

如果你有两个环境,比如负载均衡后面的一个产品,以及不在负载平衡后面的开发或者暂存,并且你想使用相同的.htaccess文件,你需要同时使用%{HTTP:X-FORWARDED-FOR}和%{REMOTE_ADDR} – 为两个条件分配IP地址。