Nginx proxy_pass cookie

时间:2013-11-03 10:04:47

标签: php apache cookies nginx

我们拥有什么:

  • 一堆apache nginx。
  • 论坛Tinyboard。

通过Apache授权正常进行,但使用nginx作为函数mkhash:

    function mkhash($username, $password, $salt = false) {
    global $config;

    if (! $salt) {
    // Create some sort of salt for the hash
     $salt = substr(base64_encode(sha1(rand(). time(), true). $config['cookies']['salt']), 0 , 15) ;

     $generated_salt = true;
    }

     // Generate hash (method is not important as long as it's strong)
     $hash = substr(base64_encode(md5($username . $config['cookies']['salt']. sha1($username . $password . $salt . ($config['mod']['lock_ip']? $_SERVER['REMOTE_ADDR']:''), true), true)), 0 , 20);

    if (isset($generated_salt))
     return array($hash, $salt);
    else
     return $hash;
    }

未返回正确的值,授权失败。 验证如下:

    if ($cookie[ 1 ]! == mkhash($cookie[0], $user['password'], $cookie[2] ) {
     // Malformed cookies
     destroyCookies();
     mod_login();
     exit;
    }

为了成功,不应执行登录条件。

通过nginx返回的示例值(登录失败):

  • cookie0:admin
  • cookie1:Ib37H5U7hCi6Br9M09V
  • cookie2:Nn2wUxlnirvgzkn
  • mkhash:fN1jv3t9ccThde0Kp30h

通过apache返回的示例值(登录成功):

  • cookie0:admin
  • cookie1:SgaMoQ07upLoz9Q7Wdz6
  • cookie2:Zp6BQ2b20Jsh 1R
  • mkhash:SgaMoQ07upLoz9Q7Wdz6

Apache挂在端口82上(如果在该端口验证成功处理正确)。 Nginx本身只接受静态文件,动态内容取自Apache。可能是什么原因?

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_connect_timeout 120;
        proxy_send_timeout 120;
        proxy_read_timeout 180;
    }

1 个答案:

答案 0 :(得分:2)

在哈希生成中,您可以使用$_SERVER['REMOTE_ADDR']

这将始终设置为127.0.0.1。

您需要将其更改为$_SERVER['HTTP_X_REAL_IP']以获取相同的IP地址(X-Real-IP是您在nginx.conf中定义的内容)