如何在HAProxy配置中转义#character?

时间:2017-08-10 19:14:13

标签: angularjs haproxy

我试图模块化我在Angular-JS中的前端,我们正在使用HA-proxy作为负载均衡器和K8s。

HA-proxy配置中的每个ACL都附加到K8中的不同服务,因为我们使用Angular和(启用了hash-bang),在HA代理配置文件中我们使用它作为识别不同的模块。

以下是我在HA-proxy中的配置失败,因为即使遵循HA Documentation,我也无法转义文件中的#。

acl login-frontend path_beg /\#/login
use_backend login-frontend if login-frontend

acl elc-frontend path_beg /\#/elc
use_backend elc-frontend if elc-frontend

我已尝试将其转义为/%23 / login和/'#' / admin但未成功。

任何想法都将不胜感激。

2 个答案:

答案 0 :(得分:0)

RFC 3986

中定义的片段(一切后跟#字符)
  

与任何URI一样,使用片段标识符组件则不然      意味着将发生检索行动。带有片段的URI      标识符可以用于指代没有任何的辅助资源      意味着主要资源是可访问的或将来的      访问。

并且它在客户端使用,因此客户端(浏览器,curl,...)不会发送请求。作为参考:Is the URL fragment identifier sent to the server?

所以没有必要用它来路由/ acl。 haproxy为此提供转义序列的原因是您可能希望将其包含在主体,自定义标题中......但同样,您不会从请求行(带URI的第一行)获取该部分。

答案 1 :(得分:0)

这里真正发生的是用户从HAProxy /请求,然后Angular在用户的浏览器中解析#/logic#/elc部分,以决定下一步要做什么。

我的Ember应用遇到了类似的问题。出于搜索引擎优化的目的,我将“营销”页面和“应用”页面分开。

然后,我将我的Ember应用程序安装在/app上,并使HAProxy将请求路由到为我的Ember应用程序提供服务的backend。对于“其他”(即/contact-us)的请求已路由到处理营销页面的backend

  • /app/* -> server1 (Ember pages)
  • / -> server2 (static marketing pages)

由于我在网上徘徊着一些仍然指向/#/login之类的网址,但实际上现在应该是/app/#/login了,我要做的就是编辑index.html由我的营销后端提供服务的页面,并将Javascript添加到解析了该网址的页面。如果它检测到/#/login,则会强制重定向到/app/#/login

我希望这可以帮助您弄清楚如何为Angular应用实现相同的功能。