Nginx 子域:重定向 /.let's Encrypt 的知名路径

Nginx Subdomains: Redirect /.well-known path for Let's Encrypt

我有一个 Nginx 服务器 运行 两个子域。其中一个使用 proxy_pass 将所有内容重定向到 Meteor 应用程序,另一个子域仅使用 Laravel 但在与普通域不同的目录中。

因此,当我开始 ./letsencrypt-auto 时,我收到了两个子域的以下错误消息:

Failed authorization procedure. subdomain.mydomain.com (http-01): urn:acme:error:unauthorized ::
The client lacks sufficient authorization :: Invalid response from http://subdomain.mydomain.com/.well-known/acme-challenge/xyzxyzxy_xzyzxyxyyx_xyzyxzyxz: "<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>

我对此的解释是,它不起作用,因为我的 Laravel-子域不在 /var/www/domain.com/html 中,而是在 /var/www/laravel/html 中,而我的 Meteor-Application 在其他地方并且ngnix 只是做代理传递。

所以我的问题是: 我可以将两个子域的 /.well-known/acme-challenge 重定向到真正的 /.well-known 以便 letsencrypt-auto 不会抛出此错误?


更多信息:

我试过了

location '/.well-known/acme-challenge' {
    default_type "text/plain";
    root /tmp/letsencrypt-auto;
}

但是没用...

我的 Meteor 子域的配置:

server {
        listen 80;
        listen [::]:80;

        # SSL configuration
        listen 443 ssl;
        listen [::]:443 ssl;

        ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;

        […] SSL stuff […]


        server_name meteor.domain.com;

        location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header X-Forwarded-For $remote_addr;
        }

        location ~ /.well-known {
                allow all;
        }

}

我的 Laravel 子域的配置:

server {
        listen 80;
        server_name laravel.domain.com;

        listen 443 ssl;
        listen [::]:443 ssl;

        ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;

        […] SSL stuff […]

        root /var/www/laravel/html;


        location / {
                try_files $uri $uri/ /index.php$is_args$args;
        }

    location ~ /.well-known {
                allow all;
        }

    location ~ \.(hh|php)$ {
        fastcgi_keep_conn on;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}    

您的 location ~ /.well-known 块是正则表达式位置,将优先于您尝试添加的前缀位置。

您需要删除它们。

请参阅 location 指令中的 this document

好的,感谢 Richard Smith 的提示,我解决了它:

我将其保存在 domain.com 部分的配置部分中,如 this 教程中所述。

location / {
    try_files $uri $uri/ =404;
}

但将其放入子域的配置部分。domain.com改为:

location /.well-known/ {
    root /var/www/domain.com/html;
}

它所做的是将对 subdomain.domain.com/.well-known/[anything] 的任何请求处理为 domain.com/.well-known/[anything],因此 letsencrypt-auto 没有错误。