Przekieruj wszystkie żądania do HTTPS, z wyjątkiem jednego podkatalogu

13

Próbuję przejść z certyfikatów z podpisem własnym do certyfikatów Let's Encrypt na moim serwerze internetowym Nginx.

Obecnie przekierować wszystkie żądania do http/80celu https/443, który wykorzystuje własny podpisany certyfikat stworzyłem jakiś czas temu.

Teraz - z tego, co rozumiem, Let's Encrypt wysyła żądanie do portu 80 (ponieważ korzystam z webrootopcji certbot). Te żądania są przekierowywane, co powoduje, że generowanie certyfikatu kończy się niepowodzeniem.

Próbowałem to osiągnąć za pomocą następującego bloku serwera, nasłuchując na porcie 80:

server {
        listen  80;     
        server_name     sub.domain.tld;
        server_tokens   off;


        location /.well-known {
                root /var/www/letsencrypt;
        }

        location / {
                return 301 https://$host$request_uri;
        }
}

Ale i tak żądania /.well-knownsą przekierowywane https/443.

W jaki sposób można przekierować wszystkie żądania od http/80celu https/443, z wyjątkiem wniosków o dopuszczenie do /.well-known/?

SaAtomic
źródło
1
O ile mi wiadomo, webrootz certbotopcją wymaga zwykłego http.
SaAtomic
2
Jak sprawdziłeś przekierowanie? Wydaje mi się, że twoja przeglądarka szanuje nagłówki HSTS dla twojej domeny, ale szyfrujmy bot by to zignorował. Sprawdź w wget/curl
Alexey Ten

Odpowiedzi:

17

Spróbuj tego:

server {
    listen  80;     
    server_name     sub.domain.tld;
    server_tokens   off;

    root /var/www/letsencrypt;

    location /.well-known {
        try_files $uri $uri/ =404;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

Ponieważ try_filesna twoim serwerze wirtualnym nie było wpisu, nie wiedziało, co zrobić z przychodzącymi żądaniami /.well-known.

Tero Kilkanen
źródło
2
locationbez try_fileswysyłania pliku z rootkatalogu.
Alexey Ten
1
dziwne, mam dokładnie taką samą sytuację i nie używam try_filesi działa idealnie dla mnie. W rzeczywistości mam dokładnie taką samą konfigurację, jak podano w pytaniu. Jedyną różnicą jest location /.well-known/zamiast location /.well-known(zauważ ukośnik). Więc może na tym polega problem?
Olle Kelderman