【问题标题】:Reverse proxy converting session cookie to path prefix反向代理将会话 cookie 转换为路径前缀
【发布时间】:2020-10-14 04:11:21
【问题描述】:

我正在解决一些用户需要为网络应用创建多个会话的问题。浏览器一次只能保存一个会话 cookie(没有尴尬的浏览器黑客,这表示用户不够精明,无法处理),我想通过创建反向代理来解决这个问题,其中 URL 的第一部分实际上是联系后端应用程序时使用的会话 cookie。

下面是这个想法的说明:

Client Request:
GET https://myproxy/

Proxy Request:
GET https://example.com/

Application response:
302 https://example.com/welcome
Set-Cookie: session=ABCDEFGHIJKLMNOP

Proxy Response
302 https://myproxy/ABCDEFGHIJKLMNOP/welcome

Client Request
GET https://myproxy/ABCDEFGHIJKLMNOP/welcome

Proxy Request
GET https://example.com/welcome
Cookie: session=ABCDEFGHIJKLMNOP

希望这能证明这个想法。我知道如何使用带有 ProxyPass、ProxyPassReverse 和 mod_proxy_html 的 Apache 为单个静态前缀完成此操作,但是从 cookie 中提取的动态前缀似乎无法实现。

我可以把它写成一个成熟的应用程序,但我想知道是否有任何 Web 服务器(apache、nginx 等)有一些内置的方法来配置这种行为?也许用 mod_perl?

【问题讨论】:

    标签: apache nginx reverse-proxy


    【解决方案1】:

    我认为使用 nginx 可以做到这一点,这是一个想法:

    map $upstream_cookie_session $prefix {
        ~^(.*)$    $1/;
    }
    
    upstream backend {
        server    example.com;
    }
    
    server {
        listen 443 ssl;
        server_name myproxy.example.com;
        # other ssl parameters here (key, certificate etc.)
    
        # root URI client request
        location = / {
            proxy_set_header Host example.com;
            # other HTTP headers setup here
            proxy_redirect https://example.com(/.*)$ https://myproxy.example.com/$prefix$1;
            proxy_cookie_path / /$prefix;
            proxy_pass https://backend;
        }
    
        # prefixed URI client request, assuming prefix is the session id
        location ~ ^/(?<session>[^/]+)(?<path>/.*) {
            # rewrite URI and remove the prefix path
            rewrite ^ $path break;
            proxy_set_header Host example.com;
            # other HTTP headers setup here
            proxy_set_header Cookie "session=$session";
            proxy_redirect https://example.com(/.*)$ https://myproxy.example.com/$prefix$1;
            proxy_cookie_path / /$prefix;
            proxy_pass https://backend;
        }
    }
    

    当然,这只是一个想法,应该对其进行测试,并且可能还有其他警告(或者这根本行不通)。此配置不会清除从上游返回的session cookie,但会重写它的path 属性,因此不同路径的几个session cookie 不应相互干扰。

    【讨论】:

    • 谢谢!我认为你在这里找到了一个关键点;前缀不需要是 cookie 的实际值,它可以是任何导致真实 cookie 的路径组件被重写的随机数。然后,浏览器将只管理带有路径前缀的 cookie 集合,并根据 URL 发送一个。
    猜你喜欢
    • 2019-08-05
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 2017-03-04
    • 2011-04-28
    • 2021-10-30
    相关资源
    最近更新 更多