让 nginx 将所有目录(除一个目录外)重定向到 https

让 nginx 将所有目录(除一个目录外)重定向到 https

我需要 nginx 将所有 http URL 重定向到 https,“secret/” 目录除外,该目录应继续作为 http 提供。

例如:

  • http://example.com/a.html-->https://example.com/a.html
  • http://example.org/z/b.html-->https://example.org/z/b.html
  • http://example.com/.secret/x.html-->http://example.com/.secret/x.html

我的配置中有以下内容,但对于 http,它返回包含“_”的地址。

server {
    listen 80;
 
    server_name _;
 
    location /.secret {
        return http://$server_name$request_uri;
    }
 
    location / {
        return 301 https://$server_name$request_uri;
    }
}

我究竟做错了什么?

更新:

结合@mforsetti 和@Pothi_Kalimuthu 的评论,以下内容有效:

server {
    listen 80;
 
    server_name _;
 
    location /.secret { }
 
    location / {
        return 301 https://$host$request_uri;
    }
}

答案1

它返回包含“_”的地址。

server_name _;

location /.secret {
   return http://$server_name$request_uri;
}

$server_name返回分配server_nameserver块的,在您的情况下是_;因此_返回地址。

如果您希望它返回主机名或Host请求标头,请尝试使用$host, 就像是:

location /.secret {
    return http://$host$request_uri;
}

.secret/目录应继续作为 http 提供

如果你想提供目录,请指定root目录。

location /.secret {
    root /path/to/your/parent/of/secret/directory;
}

相关内容