5

我正在使用 John Papa 的 lite 服务器和 chimurai 的 HTTP 代理中间件作为开发服务器。问题出在我的会话 cookie 上,我无法保留来自真实服务器的会话 cookie。我看到了这个解决方案: https ://github.com/chimurai/http-proxy-middleware/issues/78

但我看不出与我的 bs-config.js 有什么相似之处:

var proxy = require('http-proxy-middleware');

module.exports = {
    port: 3003,
    server: {
        middleware: {
            1: proxy('demo/webservice/jaxrs', {
                target: 'https://localhost:8443',
                secure: false, // disable SSL verification
                changeOrigin: true   // for vhosted sites, changes host header to match to target's host
            }),
            2: require('connect-history-api-fallback')({index: '/index.html', verbose: true})
        }
    }
};

有人知道如何合并这两者吗?

更新:这是响应标头的一部分:

set-cookie:JSESSIONID=620083CD7AEB7A6CC5772AC800E673E3; Path=/appServer/webservice/jaxrs; Secure
strict-transport-security:max-age=31622400; includeSubDomains
Transfer-Encoding:chunked

UPDATE2:我认为我的配置应该是这样的:

var proxy = require('http-proxy-middleware');

function relayRequestHeaders(proxyReq, req) {
    Object.keys(req.headers).forEach(function (key) {
        proxyReq.setHeader(key, req.headers[key]);
    });
};

function relayResponseHeaders(proxyRes, req, res) {
    Object.keys(proxyRes.headers).forEach(function (key) {
            res.append(key, proxyRes.headers[key]);
        });
};

module.exports = {
    port: 3003,
    server: {
        middleware: {
            1: proxy('/skybox', {
                target: 'https://localhost:8443',
                secure: false, // disable SSL verification
                changeOrigin: true,   // for vhosted sites, changes host header to match to target's host
                onProxyReq: relayRequestHeaders,
                onProxyRes: relayResponseHeaders
            }),
            2: require('connect-history-api-fallback')({index: '/index.html', verbose: true})
        }
    }
};

但现在 res.append 未定义 :(

4

5 回答 5

6

试试看:

var cookie;
function relayRequestHeaders(proxyReq, req) {
  if (cookie) {
    proxyReq.setHeader('cookie', cookie);
  }
};

function relayResponseHeaders(proxyRes, req, res) {
  var proxyCookie = proxyRes.headers["set-cookie"];
  if (proxyCookie) {
    cookie = proxyCookie;
  }
};

它与 lite-server 一起使用

于 2016-10-25T12:55:33.110 回答
2
// Set up the proxy.
if (dev) {
  const { createProxyMiddleware } = require('http-proxy-middleware')
  server.use(
    '/api',
    createProxyMiddleware({
      target: 'https://api.example.com/',
      changeOrigin: true,
      cookieDomainRewrite: 'localhost',
      // logLevel: 'debug',
    })
  )
}

这是我的配置。我认为重点是

cookieDomainRewrite: 'localhost',
于 2021-04-19T08:35:45.730 回答
1

不确定您的 localhost:3003 是如何配置的;有或没有https:...

假设您使用的是 http://localhost:3000(不是 https:);您的目标中的Securecookie 属性可能是您的浏览器忽略 cookie 的原因。

4.1.2.5。安全属性

Secure 属性将 cookie 的范围限制为“安全”
通道(其中“安全”由用户代理定义)。当cookie 具有 Secure 属性时,仅当请求通过 安全通道(通常是 HTTP over Transport Layer Security (TLS))传输时
,用户代理才会将
cookie 包含在 HTTP 请求中

来源:https ://www.rfc-editor.org/rfc/rfc6265#section-4.1.2.5

浏览器可能会根据以下所述的算法忽略 cookie:https ://www.rfc-editor.org/rfc/rfc6265#section-5.4

尝试删除Secure Attribute,看看是否有帮助

于 2016-08-16T22:30:15.557 回答
1

在我的情况下,设置"cookieDomainRewrite": "localhost",有效。这允许浏览器正确设置 cookie,因为域将匹配

下面setupProxy.js是 React 的完整配置:

const {createProxyMiddleware} = require('http-proxy-middleware');

module.exports = function (app) {
    app.use(
        '/api',
        createProxyMiddleware({
            target: 'http://localhost:8000',
            changeOrigin: true,
            cookieDomainRewrite: "localhost",
        })
    );
};
于 2020-11-24T20:50:09.057 回答
0

B.Ma 的回答给了我一个提示来解决我的 webpack-dev-server 问题,它可能在后台使用 http-proxy-middleware 来代理请求。问题来自 httpOnly cookie,这种方法解决了它。这是我在 webpack.conf.js 中使用的配置:

let myappSessionValidationCookie = '';

module.exports = {
    ...
    devServer: {
        publicPath: 'http://localhost:9000/',
        ...
        proxy: {
            '/api': {
                target: 'http://localhost/myapp',
                changeOrigin: true,
                onProxyReq: function (proxyReq) {
                    if (myappSessionValidationCookie) {
                        proxyReq.setHeader('cookie', myappSessionValidationCookie);
                    }
                },
                onProxyRes: function (proxyRes) {
                    const proxyCookie = proxyRes.headers['set-cookie'];
                    if (proxyCookie) {
                        myappSessionValidationCookie = proxyCookie;
                    }
                },
            },
        },
    },
});

配置的一些解释。我有一个后端在 localhost/myapp/api/* 下为应用程序的 api 提供服务,并设置了一个用于身份验证的 httpOnly cookie。该标头(set-cookie)未由代理传输到新位置(localhost:9000/myapp/api/*),因此浏览器没有保留它,并且所有后续请求都没有此cookie并且失败。所有的功劳都归于 B.Ma。非常感谢你的帖子!!!

于 2020-07-27T07:46:41.857 回答