У меня простая конфигурация, перенаправляю все, кроме запросов letsencrypt, на https, а затем мои виртуальные хосты только на https ..
В настоящее время все мои запросы перенаправляются на https, а затем на 404 для letsencrypt:
Это мой конфиг ...
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
location ^~ /.well-known/acme-challenge/ {
allow all;
default_type text/plain;
return 200 "$1.abcd-efgh";
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name plex.my_domain.com;
ssl_session_timeout 30m;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_certificate /root/.acme.sh/plex.my_domain.com/fullchain.cer;
ssl_certificate_key /root/.acme.sh/plex.my_domain.com/plex.my_domain.com.key;
ssl_session_cache shared:SSL:10m;
add_header X-Xss-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Strict-Transport-Security "max-age=2592000; includeSubdomains" always;
add_header X-Frame-Options "SAMEORIGIN" always;
proxy_hide_header X-Powered-By;
add_header 'Referrer-Policy' 'no-referrer';
add_header Content-Security-Policy "frame-ancestors my_domain.com plex.my_domain.com;";
location / {
proxy_pass http://127.0.0.1:32400;
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#Next three lines allow websockets
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Ну, не HSTS в моем случае
server {
# ...
location /.well-known/acme-challenge/ {
# put your configuration here, if needed
}
location / {
return 301 https://$server_name$request_uri;
}
}
Резюме: поместите 301 редирект внутри /
расположение
У вас есть заголовки HSTS, установленные в вашем блоке сервера https. Это означает, что если вы посетите свой сайт с https
один раз с вашим браузером, ваш браузер всегда будет подключаться к вашему домену с https после первого посещения.
Это означает, что вы не можете проверить свою конфигурацию в браузере. Вам нужно проверить это с помощью curl
или аналогичный инструмент, который не хранит списки HSTS.
Для вашей конфигурации есть небольшая настройка, вы можете использовать простое соответствие префикса location /.well-known/acme-challenge
для вашего местоположения LetsEncrypt. nginx будет использовать наиболее точное совпадение из location
блоки.
Вы можете создать сниппет для использования в своей конфигурации в /etc/nginx/snippets.d/letsencrypt
location ~ /\.well-known/acme-challenge/ {
allow all;
default_type "text/plain";
root /usr/share/nginx/html;
try_files $uri =404;
break;
}
затем включите его в свое местоположение:
server {
listen 80;
server_name *.yourdomain.org yourdomain.org;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name *.yourdomain.org yourdomain.org;
include snippets.d/letsencrypt;
ssl_certificate /etc/letsencrypt/live/yourdomain.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.org/privkey.pem;
location / {
# your config for the domain goes here
}
}
Убедитесь, что 301 редирект находится внутри location
блок (иначе он будет вызываться каждый раз).
Убедитесь, что перенаправление ведет на весь домен, а не на подкаталог другого домена (например, https://yourdomain.org/subdir$request_uri
), так что хорошо известная задача маршрутизируется правильно.