我需要 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_name
给server
块的,在您的情况下是_
;因此_
返回地址。
如果您希望它返回主机名或Host
请求标头,请尝试使用$host
, 就像是:
location /.secret {
return http://$host$request_uri;
}
.secret/
目录应继续作为 http 提供
如果你想提供目录,请指定root
目录。
location /.secret {
root /path/to/your/parent/of/secret/directory;
}