这是关于两个子域名。第一个 (www) 应通过 http 访问。第二个 (cloud) 应通过 https 访问。
以下是我的条目的相关部分:
server {
listen 80;
server_name cloud.example.de;
rewrite ^ https://$server_name$request_uri? permanent; # enforce https
}
server {
listen 443 ssl;
server_name cloud.example.de;
root /home/user/web/cloud;
}
server {
listen 80;
server_name www.example.de;
root /home/user/web/cms;
#etc.
}
当我现在打电话时http://cloud.example.de我被重定向到https://cloud.example.de很好。但是当我打电话时http://www.example.de我也被重定向到https://www.example.de,这让我找到了 cloud.example.com 的内容,因为这是唯一设置为由端口 443 使用的服务器名称。www
子域的访问日志中没有条目。
有另一个子域指向 phpPgAdmin。我可以正常访问它,它没有被重写。
server {
listen 80;
server_name pgsql.example.de;
root /home/user/web/phppgadmin;
#etc
}
缺什么?仅当服务器名称与 cloud.example.de 匹配时才进行重写。
服务器条目的顺序是否相关或无关紧要?
在 Ubuntu 11.04 上使用 nginx 0.8.54。
答案1
您提供的示例配置看起来正确,但我怀疑它是否能像您描述的那样工作(您在尝试简化它时可能做了太多更改)。
您是否在类似 的程序中遇到了错误重定向curl
,还是仅在浏览器中遇到错误重定向?我处理过permanent
在 Mozilla 中永久缓存的情况(例如来自之前的nginx.conf
),而没有任何方法可以使单个301
缓存条目无效,因此,您确定这不是缓存问题吗?
无论如何,您也可以尝试使用if
使重定向有条件(也许第一个服务器被选为默认服务器):
if ($host = "cloud.example.de") {
rewrite ^ https://$server_name$request_uri? redirect;
}
return 403;
或者,另一种选择,
server {
listen 80;
listen 443 ssl;
server_name cloud.example.de;
if ($scheme != "https") {
rewrite ^ https://$server_name$request_uri? redirect;
}
root /home/user/web/cloud;
}
并尽量curl -v
确保您能看到那里的东西。