0

I have to upload a website that uses Laravel. The server I must use are using a reverse proxy and when I put the files i developped on my computer, I'm getting a DNS error.

I do not have access to the server configuration, I can only upload/download files on the website's server partition.

I searched to find a solution but anything I can find was sort of related to this question.

Community
  • 1
  • 1
A.Desert
  • 41
  • 8
  • I'm not using Laravel, but I have a simple example in kind of pure PHP if it makes some interest for you – Bobot May 12 '16 at 07:37
  • That would be great, maybe it will show me how I have to maneuver in the proxy's dark waters. – A.Desert May 12 '16 at 07:40

1 Answers1

0

So, this is not Laravel version, but this can help you, I hope !

Here is some code I wrote in cakePHP 2.X because I have some issues with a reverse proxy too

Cache class is the one from cakePHP, it's very simple (60 sec expiration, automatically serialized data).

LogError function is a simple log function

The code is the following

// 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;
}

Then you just have to call the clientIp(); function.

If you have a static IP Address for your reverse proxy, you can just set it manually in the code, but that's not a good practice. But you will not need to use cache, and it will simplify a lot the code.

If you use a dynamic reverse proxy, you will have to query it on its hostname like this (what I did in the posted code) :

gethostbynamel('reverse-proxy-addr') to get a list of possible rproxy IPs

OR

gethostbyname('reverse-proxy-addr') to get one IP for rproxy

In other case you just have to check that REMOTE_ADDR is in a list of IPs marked as Reverse-proxy IPs

Hope it helps !

Bobot
  • 1,118
  • 8
  • 19