Nginx - 错误的重定向?

时间:2017-06-13 22:01:41

标签: redirect nginx http-status-code-404 config lets-encrypt

我正在使用Nginx作为Web服务器与LetsEncrypt一起加密我的连接。 我的主页有多个子域名,例如www.domain.com,mail.domain.com等。 现在我想将所有“/.well-known”连接重定向到一个特殊的根文件夹。

我认为我有正确的配置,但结果不是我想要的。

这是我的配置:

default.vhost

#=============================================
#== Server
#==============================================

server {

        #=============================================
        #== General
        #=============================================

        # Port
        listen 80;

        # Server name
        #server_name _;

        #=============================================
        #== Locations
        #=============================================

        location /.well-known {
                #default_type "text/plain";
                root /var/wwww/LetsEncrypt;
        }

        location / {
                return 301 https://www.example.com$request_uri;
        }
}


server {

        #=============================================
        #== General
        #=============================================

        # Port
        listen 443 ssl;

        # Server name
        #server_name _;

        #=============================================
        #== Locations
        #=============================================

        location / {
                return 301 https://www.example.com$request_uri;
        }
}

www.domain.com

#=============================================
#== HTTP-Server
#=============================================

server {

        #=============================================
        #== General
        #=============================================

        # Port
        listen 443 ssl default_server;

        # Server name
        server_name www.example.com;

        # Root folder
        root /var/www/www.example.com/web/;

        # Order of index files
        index index.php index.html index.htm;

        #=============================================
        #== Includes
        #=============================================

        # SSL configuration
        include /etc/nginx/ssl.conf;

        # PHP configuration
        include /etc/nginx/php.conf;

        #=============================================
        #== Locations
        #=============================================

        location /.well-known/acme-challenge {
                #default_type "text/plain";
                root /var/wwww/LetsEncrypt;
        }

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

        location ~ /\.ht {
                deny all;
        }
}

mail.domain.com

#=============================================
#== HTTP-Server
#=============================================

server {

        #=============================================
        #== General
        #=============================================

        # Port
        listen 443 ssl;

        # Server name
        server_name mail.example.com;

        # Root folder
        root /var/www/mail.example.com/web/;

        # Order of index files
        index index.php index.html index.htm;

        #=============================================
        #== Includes
        #=============================================

        # SSL configuration
        include /etc/nginx/ssl.conf;

        # PHP configuration
        include /etc/nginx/php.conf;

        #=============================================
        #== Locations
        #=============================================

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

        location ~ /\.ht {
                deny all;
        }
}

那么,会发生什么.. mail.domain.com和www.domain.com运作良好。 问题是.well已知的规则。 Nginx忽略它,我总是被重定向,而不是从“/ var / www / LetsEncrypt”获取文件。

我认为default_server是问题,但是在将它移动到“default.vhost”之后没有任何工作(总是404 ..听起来有点奇怪......)。

我希望你们能帮助我:(

亲切的, 安德烈亚斯

1 个答案:

答案 0 :(得分:0)

首先,您需要使用nginx 'location begins with' modifier ^~来捕获以指定目录开头的所有请求。

location ^~ /.well-known/acme-challenge {

其次你有/var/wwww/LetsEncrypt(4个w)而不是/var/www/LetsEncrypt

您的位置区块应如下所示:

location ^~ /.well-known/acme-challenge {
    #default_type "text/plain";
    root /var/www/LetsEncrypt;
}

还要注意alias和root之间的区别,因为root会将uri附加到路径上,例如:

alias /var/www/LetsEncrypt; # Will serve files from /var/www/LetsEncrypt

root /var/www/LetsEncrypt; # Will serve files from /var/www/LetsEncrypt/.well-known/acme-challenge

如果您尝试提供特定目录,这可能会让您失望。