NGINX将除letsencrypt以外的所有内容redirect到https

我有一个简单的configuration,除了letsencrypt请求redirect到https,然后让我的虚拟主机在https ..

目前我所有的请求都被redirect到了https,然后是一个404的letsencrypt:

这是我的configuration…

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"; } } 

您在https服务器块中设置了HSTS标头。 这意味着,如果您使用https浏览了一次https ,那么您的浏览器将在第一次访问后始终使用https连接到您的网域。

这意味着你不能用浏览器testing你的configuration。 您需要使用curl或不存储HSTS列表的类似工具对其进行testing。

对你的configuration有一个小小的调整,你可以使用一个简单的前缀匹配location /.well-known/acme-challenge为你的LetsEncrypt位置。 nginx将使用location块中最具体的匹配。