为反向代理配置Laravel


Configuring Laravel for Reverse Proxy

我必须上传一个使用Laravel的网站。我必须使用的服务器使用反向代理,当我把我开发的文件放在电脑上时,我会收到一个DNS错误。

我无法访问服务器配置,只能在网站的服务器分区上传/下载文件。

我想找到一个解决方案,但我能找到的任何东西都与这个问题有关。

所以,这不是Laravel版本,但我希望这能帮助你!

以下是我在cakeHP 2.X中编写的一些代码,因为我对反向代理也有一些问题

Cache类是cakeHP中的一个类,它非常简单(60秒过期,自动序列化数据)。

LogError函数是一个简单的日志函数

代码如下

// Constants
define('REVERSE_PROXY_ADDR' , 'r-proxy.internal-domain.com');
define('REVERSE_PROXY_CACHE', 'r-proxy');
// Cache Config
Cache::config(REVERSE_PROXY_CACHE, array(
    'engine'    => 'File',
    'prefix'    => REVERSE_PROXY_CACHE . '_',
    'path'      => CACHE . REVERSE_PROXY_CACHE . '/',
    'serialize' => true,
    'duration'  => 60,
));

function clientIp()
{
    // Originaly from CakePHP 2.X
    // ------------------------------
    if ( isset($_SERVER['HTTP_CLIENT_IP']) )
    {
        $ipaddr = $_SERVER['HTTP_CLIENT_IP'];
    }
    else
    {
        $ipaddr = $_SERVER['REMOTE_ADDR'];
    }
    if ( isset($_SERVER['HTTP_CLIENTADDRESS']) )
    {
        $tmpipaddr = $_SERVER['HTTP_CLIENTADDRESS'];
        if ( !empty( $tmpipaddr ) )
        {
            $ipaddr = preg_replace('/(?:,.*)/', '', $tmpipaddr);
        }
    }
    $ip = trim($ipaddr);
    // ------------------------------
    // Reverse proxy stuff
    if ( defined('REVERSE_PROXY_ADDR') && defined('REVERSE_PROXY_CACHE') )
    {
        $xfor = preg_replace('/(?:,.*)/', '', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $list = Cache::read('iplist', REVERSE_PROXY_CACHE);
        if ( $list === false )
        {
            $list = gethostbynamel(REVERSE_PROXY_ADDR);
            Cache::write('iplist', $list, REVERSE_PROXY_CACHE);
        }
        // empty or unreadable
        if ( empty( $list ) )
        {
            logError('Unable to gather reverse proxy ip list, or empty list');
            logError('Type : ' . gettype($list));
            logError('IP : ' . $ip . ' - X-FORWARDED-FOR : ' . $xfor);
            return $ip;
        }
        // not array ?!?!
        if ( !is_array($list) )
        {
            logError('Given list was not an array');
            logError('Type : ' . gettype($list));
            logError($list);
            return $ip;
        }
        // if in array, give forwarded for header
        if ( in_array($ip, $list, true) )
        {
            return $xfor;
        }
    }
    return $ip;
}

然后您只需要调用clientIp();函数。

如果您的反向代理有一个静态IP地址,您可以在代码中手动设置它,但这不是一个好的做法。但是您将不需要使用缓存,它将简化许多代码。

如果你使用动态反向代理,你将不得不像这样查询它的主机名(我在发布的代码中所做的):

gethostbynamel('reverse-proxy-addr')获取可能的rproxy IP 列表

gethostbyname('reverse-proxy-addr')为rproxy 获取一个IP

在其他情况下,您只需检查REMOTE_ADDR是否在标记为反向代理IP 的IP列表中

希望它能有所帮助!