symfony – 将cookie传递给CloudFront源但阻止缓存

前端之家收集整理的这篇文章主要介绍了symfony – 将cookie传递给CloudFront源但阻止缓存前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在Symfony Web应用程序前面使用CloudFront作为缓存.要根据用户的角色(管理员,客户……)获取缓存,我会在Lambda @ Edge Viewer请求触发器中生成基于用户角色的哈希.我将该哈希作为请求标头传递给我的源X-User-Context-Hash.

我现在的问题是我需要将PHPSESSID cookie传递给我的来源以获得正确的缓存响应,但我不想将缓存基于PHPSESSID的值.我只需要我的缓存响应基于X-User-Context-Hash的值而不是我的会话cookie.

下面的图片应该详细解释我的问题

有没有可能实现这一目标?

非常感谢任何帮助.

这是我的Lambda @ Edge Viewer请求触发器:

  1. 'use strict';
  2.  
  3. function parseCookies(headers) {
  4. const parsedCookie = {};
  5. if (headers.cookie) {
  6.  
  7. console.log(`${headers.cookie[0].value}`);
  8.  
  9. headers.cookie[0].value.split(';').forEach((cookie) => {
  10. if (cookie) {
  11. const parts = cookie.split('=');
  12. parsedCookie[parts[0].trim()] = parts[1].trim();
  13. }
  14. });
  15. }
  16. return parsedCookie;
  17. }
  18.  
  19. exports.handler = (event,context,callback) => {
  20. const request = event.Records[0].cf.request;
  21. const headers = request.headers;
  22.  
  23. const https = require('https');
  24.  
  25. // Read session cookie
  26. const parsedCookies = parseCookies(headers);
  27. let cookie = '';
  28. if (parsedCookies) {
  29. if(parsedCookies['PHPSESSID']) {
  30. cookie = `PHPSESSID=${parsedCookies['PHPSESSID']}`;
  31. }
  32. }
  33.  
  34. console.log(`Cookie: ${cookie}`);
  35.  
  36. // Send request to origin host at /_fos_user_context_hash
  37. // passing the original session cookie
  38. const options = {
  39. hostname: `${request.headers.host[0].value}`,port: 443,path: '/_fos_user_context_hash',method: 'HEAD',headers: {
  40. 'Cookie': cookie,'Accept': 'application/vnd.fos.user-context-hash','Vary' : 'Cookie'
  41. }
  42. };
  43.  
  44. const req = https.request(options,(res) => {
  45. console.log('statusCode:',res.statusCode);
  46. console.log('headers:',res.headers);
  47.  
  48. // Read the X-User-Context-Hash from the hash endpoint
  49. const headerName = 'X-User-Context-Hash';
  50. let hash = 'anonymous';
  51.  
  52. if (res.headers[headerName.toLowerCase()]) {
  53. hash = res.headers[headerName.toLowerCase()];
  54. }
  55.  
  56. // Append X-User-Context-Hash before passing request on to CF
  57. request.headers[headerName.toLowerCase()] = [{ key: headerName,value: hash }];
  58.  
  59. callback(null,request);
  60.  
  61. }).on('error',(e) => {
  62. console.error(e);
  63. // Forward request anyway
  64. callback(null,request);
  65. });
  66.  
  67. req.end();
  68. }
  69.  
  70.  
  71. ;

解决方法

这是我最终解决了我的问题:

CloudFront行为

我将行为配置为不将任何cookie转发到源,但仅基于头部主机和X-User-Context-Hash进行缓存(参见屏幕截图).

下图解释了我的lambda @ edge过程:

>在“查看器请求”触发器中,我读取了名为PHPSESSID和REMEMBERME的基于用户的cookie,并通过X-Session-Cookies标头传递这些值.
>如果我的请求URL和给定的主机以及X-User-Context-Hash标头匹配,则Cloud-Front将返回缓存的项目并在此处停止.
>如果没有匹配,则触发“Origin Request”触发器.当该事件触发自定义标头时,X-Session-Cookies可用.因此,我从X-Session-Cookies标头中获取值,并将request.headers.cookie的值设置为该值.此步骤确保PHPSESSID和REMEMBERME cookie在页面缓存之前都传递到源.

我的Lambda @ Edge功能

查看者请求触发器:

  1. 'use strict';
  2.  
  3. function parseCookies(headers) {
  4. const parsedCookie = {};
  5. if (headers.cookie) {
  6.  
  7. console.log(`${headers.cookie[0].value}`);
  8.  
  9. headers.cookie[0].value.split(';').forEach((cookie) => {
  10. if (cookie) {
  11. const parts = cookie.split('=');
  12. parsedCookie[parts[0].trim()] = parts[1].trim();
  13. }
  14. });
  15. }
  16. return parsedCookie;
  17. }
  18.  
  19. exports.handler = (event,callback) => {
  20. const request = event.Records[0].cf.request;
  21. const headers = request.headers;
  22.  
  23. const https = require('https');
  24.  
  25. let sessionId = '';
  26.  
  27. // Read session cookie
  28. const parsedCookies = parseCookies(headers);
  29. let cookie = '';
  30. if (parsedCookies) {
  31. if(parsedCookies['PHPSESSID']) {
  32. cookie = `PHPSESSID=${parsedCookies['PHPSESSID']}`;
  33. }
  34. if(parsedCookies['REMEMBERME']) {
  35. if (cookie.length > 0) {
  36. cookie += ';';
  37. }
  38. cookie += `REMEMBERME=${parsedCookies['REMEMBERME']}`;
  39. }
  40. }
  41.  
  42. console.log(`Cookie: ${cookie}`);
  43.  
  44. // Send request to origin host at /_fos_user_context_hash
  45. // passing the original session cookie
  46. const options = {
  47. hostname: `${request.headers.host[0].value}`,value: hash }];
  48.  
  49. const sessionHeaderName = 'X-Session-Cookies';
  50. request.headers[sessionHeaderName.toLowerCase()] = [{ key: sessionHeaderName,value: cookie }];
  51.  
  52. callback(null,request);
  53. });
  54.  
  55. req.end();
  56. }
  57.  
  58.  
  59. ;

原始请求触发器:

  1. exports.handler = (event,callback) => {
  2. const request = event.Records[0].cf.request;
  3.  
  4. const sessionHeaderName = 'X-Session-Cookies';
  5.  
  6. let cookie = '';
  7. if (request.headers[sessionHeaderName.toLowerCase()]) {
  8. console.log(request.headers[sessionHeaderName.toLowerCase()]);
  9. cookie = request.headers[sessionHeaderName.toLowerCase()][0].value;
  10. }
  11.  
  12. request.headers.cookie = [{ key : 'Cookie',value : cookie }];
  13.  
  14. callback(null,request);
  15. };

猜你在找的HTML相关文章