我有一个简单的配置,将除了 letsencrypt 请求之外的所有内容重定向到 https,然后让我的虚拟主机仅有的在 https 上。
目前,我的所有请求都重定向到 https,然后 letsencrypt 出现 404:
这是我的配置...
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";
}
}
答案1
您在 https 服务器块中设置了 HSTS 标头。这意味着如果您https
使用浏览器访问您的网站一次,您的浏览器在第一次访问后将始终使用 https 连接到您的域。
这意味着您无法使用浏览器测试您的配置。您需要使用curl
不存储 HSTS 列表的类似工具进行测试。
您的配置有一个小调整,您可以location /.well-known/acme-challenge
对 LetsEncrypt 位置使用简单的前缀匹配。nginx 将使用块中最具体的匹配location
。
答案2
嗯,对我来说不是 HSTS
server {
# ...
location /.well-known/acme-challenge/ {
# put your configuration here, if needed
}
location / {
return 301 https://$server_name$request_uri;
}
}
摘要:将 301 重定向放在/
位置内
答案3
您可以创建一个代码片段以在您的配置中使用/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
),以便正确路由众所周知的挑战。