使用 reqrep 更改路径,然后根据该路径选择后端

使用 reqrep 更改路径,然后根据该路径选择后端

我需要转换以下 url(不是在客户端/浏览器上,而是在 和 之间frontendbackend

从:

http://myhost.com/opt-in/<some_long_guid>.html

到:

http://myhost.com/api/distributions/<some_long_guid>/opt-in

然后在此时选择一个合适的后端。我的haproxy.conf文件如下所示:

frontend www-ssl
   #re-write the url from /opt-in/<dist_id>.html to /api/distributions/<dist_id>/opt-in

   acl url_opt-in path_beg /opt-in
   reqrep ^([^\ :]*)\ /opt-in/(.*)\.html     \1\ /api/distributions/\2/opt-in if url_opt-in

   acl url_api path_beg /api/

   #choose the api backend if the path starts with /api
   use_backend api-backend if prod url_api

backend api-backend
   server app-1 10.132.93.224:8080 check
   #get rid of the /api part when forwarding to the backend
   reqrep ^([^\ :]*)\ /api/(.*)     \1\ /\2

我已确认http://myhost.com/api/distributions/<some_long_guid>/opt-in直接击打是有效的。

然而http://myhost.com/opt-in/<some_long_guid>.html击球505 - The server does not support the HTTP protocol version used in the request.

谁能知道我为什么会遇到这个问题?

编辑:我确认我的后端正在接收请求并且正在报告这个 505。我正在尝试看看是否可以转储原始请求以查看发生了什么。

答案1

我的reqrep语句截断了HTTP/1.1路径后面的内容。因此发送到我的后端的内容是:

GET /distributions/038c0abb-8873-457d-889c-0b7c32b5f5c0/opt-in

代替:

/distributions/038c0abb-8873-457d-889c-0b7c32b5f5c0/opt-in HTTP/1.1

reqrep把语句改成:

reqrep ^([^\ :]*)\ /opt-in/(.*)\.html(.*) \1\ /distributions/\2/opt-in\3

注意:\3最后,这将添加HTTP/1.1

相关内容