我在负载均衡器后面有一个网络服务器。
我需要向 .htaccess 添加条件重定向,以便在我们离线维护网站时显示维护页面。这部分很简单:
RewriteEngine on
RewriteCond %{REQUEST_URI} !/maintenance.php$ [NC]
RewriteCond %{REQUEST_URI} !\.(jpe?g?|png|gif) [NC]
RewriteRule .* /maintenance.php [R=302,L]
但是我想添加一个条件,如果访问者的 IP 地址是我自己的,它不会将我重定向到维护页面,并且我将能够像在线一样查看和测试该网站。这部分通常也很简单:
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
被解析为负载均衡服务器的内部 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}
答案1
使用%{HTTP:X-FORWARDED-FOR}
而不是%{REMOTE_ADDR}
答案2
你需要mod_rpaf。此模块将使用另一个标头(例如 x-forwarded-for)重写 apache 中的 REMOTE_ADDR。对于使 PHP 应用程序与负载平衡器配合使用非常有用。
答案3
答案4
如果您有两个环境,比如说一个生产环境位于负载平衡之后,而一个开发或暂存环境不在负载平衡之后,并且您想使用相同的 .htaccess 文件,那么您将需要 %{HTTP:X-FORWARDED-FOR} 和 %{REMOTE_ADDR} - 为两个条件分配 IP 地址。