HAProxy前端规则匹配顺序

时间:2017-11-07 18:31:31

标签: cors options haproxy rules

我的haproxy配置如下。 (haproxy 1.7)我们希望捕获所有OPTIONS请求并直接响应它们,而不是将请求路由到后端(已启用基本身份验证)。

当我们开发它时它工作得很好但是现在似乎没有按顺序匹配规则(不确定我们有什么/没有做过导致这种情况):

global
  log 127.0.0.1 local1
  tune.ssl.default-dh-param 2048
  lua-load /etc/haproxy/cors.lua
  stats socket /var/run/haproxy.sock mode 400

  # Default certificate and key directories
  ca-base /etc/ssl/private
  crt-base /etc/ssl/private

# User lists used to enforce HTTP Basic Authentication
userlist ul_100123-2ovt9rsu
  user app1 password $6$lCjf6VnWhI$kcjmpWdV.odeYf4psUhcVKs49ZtPk3MDhg5wtLNUx658A3EWdDHJQqs9xCD1d.7zG05M2nwOxdkC6o/MSpifv0
userlist ul_100123-9uvsclqr
  user app1 password $6$DlcLoDMMu$wDm3O0W1eiQuk8gI.GmpzI1.jbBf.UYQ.KM73nHa1tGZJNfzkDpVnLUhh7v7C9yPHB1oo0cRrFnfOdeyAf/eU1     

# Front-end for public services which have SSL termination at the router.

frontend term
   bind *:443 accept-proxy ssl no-sslv3 crt router/fred-external.pem crt router/fred-external.ace.pem crt router
  reqadd X-Forwarded-Proto:\ https
  rspidel ^(Server|X-Powered-By):
  option forwardfor
  mode http
  http-request use-service lua.cors-response if METH_OPTIONS { req.hdr(origin) -m found }
  acl host_match_100123-2ovt9rsu ssl_fc_sni -i 2ovt9rsu.fredurl.com
  use_backend b_term_100123-2ovt9rsu if host_match_100123-2ovt9rsu
......
  • 如果我将-X OPTIONS卷曲到2ovt9rsu.fredurl.com,它会匹配第二条规则并转发给b_term_100123-2ovt9rsu后端,然后由于我还没有提供身份验证信息而失败。
  • 如果我将-X OPTIONS卷曲到Anything.fredurl.com,它会匹配第一个http请求,并按预期响应cors响应。

为什么2ovt9rsu.fredurl.com与第一个http请求规则不匹配,然后返回cors-response?

在日志中我们可以看到

Nov  7 18:24:09 localhost haproxy[37302]: 94.45.23.22:49853 [07/Nov/2017:18:24:09.807] term~ b_term_100123-2ovt9rsu/<lua.cors-response> -1/-1/-1/-1/73 401 249 - - PR-- 0/0/0/0/3 0/0 "OPTIONS / HTTP/1.1"

请求转发到后端

1 个答案:

答案 0 :(得分:1)

http-requestuse_backend之前执行,配置看起来不错,您是否在origin时设置了curl标题?