nginx подменяет заголовок Location: в проксированом ответе

Vladimir Rusinov vladimir на greenmice.info
Пт Фев 26 14:04:13 MSK 2010


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Приветствую!

Либо это фича, либо баг - не понимаю.

Есть конфиг примерно такого вида:

<...>
proxy_set_header  Host  $host:$proxy_port;
server_name_in_redirect off;
<...>

upstream wrike {
    ip_hash;
    server 10.10.0.31:80 max_fails=3 fail_timeout=120s;
    server 10.10.0.18:80 max_fails=3 fail_timeout=120s;
}
<...>

server {
        listen       10.10.0.30:80;
        server_name www.wrike.com;
        server_name 10.10.0.30;

        root /bla-bla-bla/
        location / {
            proxy_pass http://wrike;
        }
        <...>
}
<...>

Бакент поддерживает oauth: принимает post запрос (c логином-паролем) и
отдает редирект с key. Вот как это работает без проксирования через nginx:

$ wget --post-file post.txt http://10.10.0.31/rest/auth/authorize
- --server-response -O -
- --2010-02-26 02:55:42--  http://10.10.0.31/rest/auth/authorize
Connecting to 10.10.0.31:80... connected.
HTTP request sent, awaiting response...
  HTTP/1.1 302 Moved Temporarily
  Server: Apache-Coyote/1.1
  X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1
  Set-Cookie: <...>
  P3P: policyref="/w3c/p3p.xml", CP="NOI DSP COR NID ADMa OUR NOR STA"
  Location: http://wrikerobot.appspot.com/callback.html?oauth_token=XXX
  Content-Type: text/html;charset=UTF-8
  Content-Length: 915
  Date: Fri, 26 Feb 2010 10:55:42 GMT
  Connection: keep-alive
Location: http://wrikerobot.appspot.com/callback.html?oauth_token=XXX
[following]
- --2010-02-26 02:55:42--
http://wrikerobot.appspot.com/callback.html?oauth_token=XXX
Resolving wrikerobot.appspot.com... 74.125.127.141
Connecting to wrikerobot.appspot.com|74.125.127.141|:80... connected.
HTTP request sent, awaiting response...
  HTTP/1.0 200 OK
<дальше уже ответ стороннего сервера>

Вот как работает это через nginx с указаной выше конфигурацией:

$ wget --post-file post.txt http://10.10.0.30/rest/auth/authorize
- --server-response -O -
- --2010-02-26 02:36:41--  http://10.10.0.30/rest/auth/authorize
Connecting to 10.10.0.30:80... connected.
HTTP request sent, awaiting response...
  HTTP/1.1 302 Moved Temporarily
  Server: nginx
  Date: Fri, 26 Feb 2010 10:36:41 GMT
  Content-Type: text/html;charset=UTF-8
  Connection: keep-alive
  Set-Cookie: <...>
  P3P: policyref="/w3c/p3p.xml", CP="NOI DSP COR NID ADMa OUR NOR STA"
  Location: robot.appspot.com/callback.html?oauth_token=XXX
  Content-Length: 915
Location: robot.appspot.com/callback.html?oauth_token=XXX [following]
- --2010-02-26 02:36:41--
http://10.10.0.30/rest/auth/robot.appspot.com/callback.html?oauth_token=XXX
Reusing existing connection to 10.10.0.30:80.
HTTP request sent, awaiting response...
  HTTP/1.1 404 Not Found

Как видно, вместо Location: http://wrikerobot.appspot.com/ отдается
Location: robot.appspot.com.

С помощью шестого чувства попробовал поменять upstream wrike и
proxy_pass http://wrike на upstream jboss и proxy_pass http://jboss.

После этого location стал отдаваться правильно.

nginx 0.7.63

- -- 
Vladimir Rusinov

Twitter: http://twitter.com/vrusinov (crossposts only)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.14 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iJwEAQECAAYFAkuHqq0ACgkQSdCkhAKeJ0wN+AQA0nMT4Bsr6bll4XvLjOFsjCYu
PBu/dtjYHYyT4A6g9ITwrHhbf6zCf5RJjx2M7cvOFD8m25hWBXISPg7DVldT9y7o
NOgdPzwpuiYxNckLZuVr/nNta3R5m5Mhlcu6hQOZ62LXnLEy65bY4i0ymysLJPIs
4fKjIlhssCoTuZMxhX4=
=j9CR
-----END PGP SIGNATURE-----




Подробная информация о списке рассылки nginx-ru