haproxy и «исправление» имен хостов в запросах http - PullRequest
1 голос
/ 01 мая 2019

Я начинаю использовать haproxy для балансировки между серверами nginx (для балансировки нагрузки экземпляров rails за этими nginxen). Я хочу, чтобы 301 перенаправил все имена, которые не являются именем www, на имя www (и все http -> https). Поэтому я пишу это, что не совсем работает. На самом деле происходит то, что http -> https, но все имена на https возвращают 200, а не 301 для всех, кроме www.staging.example.com. Кроме того, я надеялся на 301, скажем, http://staging.example.com/ непосредственно на https://www.staging.example.com/, но вместо этого это всего лишь 301 на https://staging.example.com/

frontend www-http
    bind 1.2.3.4:80

    acl redirect_canonical req_ssl_sni -i staging.example.com
    acl redirect_canonical req_ssl_sni -i myname.example.com
    http-request  redirect  code 301  location  https://www.staging.example.com%[capture.req.uri]  if\
 redirect_canonical

    http-request  redirect  code 301  scheme https  if !{ ssl_fc }

    reqadd X-Forwarded-Proto:\ http
    default_backend railswebapp-backend

frontend www-https
    bind 1.2.3.4:443 ssl crt /etc/haproxy/ssl/

    # Test URI to see if its a letsencrypt request.                                                      
    acl letsencrypt-acl path_beg /.well-known/acme-challenge/
    use_backend letsencrypt-backend if letsencrypt-acl

    acl redirect_canonical req_ssl_sni -i staging.example.com
    acl redirect_canonical req_ssl_sni -i myname.example.com
    http-request  redirect  code 301  location  https://www.staging.example.com%[capture.req.uri]  if\
 redirect_canonical

    reqadd X-Forwarded-Proto:\ https
    default_backend railswebapp-backend

Есть какие-нибудь указатели на то, что я делаю неправильно?

Обновление

Исправленный блок это:

frontend www-http
    bind 1.2.3.4:80

    acl redirect_canonical hdr(host) -i staging.example.com
    acl redirect_canonical hdr(host) -i myname.example.com
    http-request  redirect  code 301  location  https://www.staging.example.com%[capture.req.uri]  if\
 redirect_canonical

    http-request  redirect  code 301  scheme https  if !{ ssl_fc }

    reqadd X-Forwarded-Proto:\ http
    default_backend railswebapp-backend

frontend www-https
    bind 1.2.3.4:443 ssl crt /etc/haproxy/ssl/

    # Test URI to see if its a letsencrypt request.                                                      
    acl letsencrypt-acl path_beg /.well-known/acme-challenge/
    use_backend letsencrypt-backend if letsencrypt-acl

    acl redirect_canonical ssl_fc_sni -i staging.example.com
    acl redirect_canonical ssl_fc_sni -i myname.example.com
    http-request  redirect  code 301  location  https://www.staging.example.com%[capture.req.uri]  if\
 redirect_canonical

    reqadd X-Forwarded-Proto:\ https
    default_backend railswebapp-backend
...