Назад | Перейти на главную страницу

Перенаправление HAProxy

Я пытаюсь заставить HAProxy перенаправить на правильный URI, если запрошенный URI не является www или https. Проблема, с которой я сталкиваюсь, заключается в том, что он перенаправляет, как только попадает в строку, что приводит к нескольким перенаправлениям.

Это моя конфигурация:

*snip*

frontend traffic-in
    bind *:80
    bind *:443 ssl crt /etc/haproxy/certificate.bundled.pem
    reqrep ^(.*)[^/]$ \1/
    redirect prefix https://www.example.com 301 if { hdr(host) -i beste.nl } 
    redirect scheme https code 301 if !{ ssl_fc }

*snip*

Если бы я пошел в http://example.com, он сначала перенаправит меня на http://example.com/, с последующим https://www.example.com.

Я хочу, чтобы он перенаправлял меня один раз, а не несколько раз, так как это повредит нашему рейтингу в Google.

Как я могу перенаправить запрос на URI с завершающей косой чертой И ssl?

Если вы разделите http-интерфейс, это может упростить

frontend http_in
  bind *:80
  redirect prefix https://www.example.com code 301

frontend https_in
  all www.example.com hdr_sub(host) www.example.com
  bind *:443 ssl crt /etc/haproxy/certificate.bundled.pem
  redirect prefix https://www.example.com code 301 if !www.example.com
  ...

Вам нужно 3 определения внешнего интерфейса, например:

frontend http
    bind *:80
    redirect scheme https code 301 if !{ ssl_fc }

frontend https
    bind *:443 ssl crt /etc/haproxy/certificate.bundled.pem
    #-------------------------
    # todo: use backends here
    #-------------------------

frontend www
    bind *:80
    acl has_www hdr_beg(host) -i www.
    http-request add-header X-Host-Redirect yes if !has_www
    redirect code 301 prefix //www.example.com if !has_www

Результат: http://example.com >> https://www.example.com