온라인에 많은 예제가 있음에도 불구하고 특히 if 문을 사용하여 많은 것을 시도했지만 지금까지 가상 호스트를 제대로 설정할 수 없었습니다.
그래서 내 가상 호스트는
a1.example.com
www.a1.example.com should redirect to https://a1.example.com
a1.example.com should redirect to https://a1.example.com
목표는 매번 www가 아닌 https로 리디렉션하는 것입니다.
이것은 지금까지 내 가상 호스트입니다. 저는 certbot을 사용하고 있습니다.
server {
server_name a1.example.com www.a1.example.com;
root /var/www/example/build;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/a1.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/a1.example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = a1.example.com) {
return 301 https://$host$request_uri;
}
listen 80;
listen [::]:80;
server_name a1.example.com www.a1.example.com;
return 404; # managed by Certbot
}
http에서 https로 리디렉션되지만 www를 www가 아닌 곳으로 리디렉션할 수는 없습니다.
내 현재 DNS 기록은 다음과 같습니다
A @ IP
A a1 IP
CNAME www domain
CNAME www.a1 www.a1.domain
답변1
이 주제에 대한 가장 좋은 답변은 @MichaelHampton이 제공한 것 같습니다.여기. 빠른 수정으로 추가할 수 있습니다.
if ($host = www.a1.example.com) {
return 301 https://a1.example.com$request_uri;
}
HTTPS 서버 블록으로 변경하고 if ($host = a1.example.com) { ... }
HTTP 서버 블록을 다음으로 변경합니다.
if ($host ~ ^(?:www\.)?a1\.example\.com$) {
return 301 https://a1.example.com$request_uri;
}
어쨌든 나는 certbot이 nginx 구성을 변경하고 인증서를 가져오거나 갱신하는 데에만 사용하도록 허용해서는 안 된다는 Michael Hampton의 의견에 전적으로 동의합니다(잘 작성된 nginx 구성 예제에 대한 그의 답변 참조).