Перезапись пути HAProxy и reqrep с конфигурацией перенаправления

С HA Proxy 1.5 мне нужно переписать URL с http://main.domain.com/my-foo на http://othersite.com:8081/other-bar

Вот что я пробовал:

frontend ft_def
  bind :80                                      
  mode http                                                  
  acl has_special_uri path_beg /my-foo
  use_backend def if has_special_uri
  default_backend def

backend def
  mode http                                       
  option forwardfor                       
  reqirep ^([^\ ]*\ )/my-foo(.*)    \1/other-bar\2
  server myserver othersite.com:8081

Это работает: URL
http://main.domain.com/my-foo/home.html
становится
http://othersite.com:8081/other-bar/home.html

и в браузере появляется начальный URL http://main.domain.com/my-foo/home.html.

Это именно то, что мне нужно: это полностью прозрачно для пользователя. Но перенаправление не работает: когда я нажимаю на ссылку на странице, URL-адрес
http://main.domain.com/other-bar/page2.html

Я хотел бы, чтобы http://main.domain.com/my-foo/page2.html вместо этого отображалось в браузере.

Возможно ли это с HA Proxy? Я пробовал много конфигураций без успеха. Спасибо!


person djool    schedule 15.10.2015    source источник


Ответы (2)


Если вы говорите о ссылках в HTML (в отличие, скажем, от заголовков Location: для перенаправления)... HAProxy 1.5 не сможет их изменить.

Предположительно, исходя из того, что вы описываете, страница /other-bar/page1.html имеет внутреннюю ссылку на <a href="/other-bar/page2.html">, хотя на самом деле должна ссылаться на <a href="page2.html">. Вам понадобятся относительные ссылки, чтобы что-то подобное работало прозрачно... в противном случае компонент "X" в вашей цепочке должен будет иметь возможность изменять ссылки на лету в теле ответа, но только ссылки, конечно, поскольку вы не хотели бы слепо заменять содержимое страницы регулярным выражением в целом... и HAProxy 1.5 не искажает тела ответов, поэтому он не может выполнять роль компонента «X».

HAProxy 1.6 может сделать это с помощью Lua, но это возможно... и если его можно заставить это сделать, то вряд ли он будет на том уровне производительности, который вам нужен. d обычно ожидают от HAProxy, потому что очистка html в Lua, вероятно, будет относительно дорогим предложением.

person Michael - sqlbot    schedule 15.10.2015

Обычно любые изменения URL должны обрабатываться самим веб-приложением, например. в конфигурации :url в Phoenix.Endpoint для среды Phoenix есть опция :path: https://hexdocs.pm/phoenix/Phoenix.Endpoint.html, который был специально разработан для этой цели. Тогда браузер по-прежнему будет запрашивать URL-адрес, отображаемый в файле HTML, но HAProxy всегда будет перезаписывать его.

person xji    schedule 30.06.2018