这是关于两个子域。 第一个(www)应该通过http访问。 第二个(云)应该通过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我redirect到https://cloud.example.de ,很好。 但是当我打电话给http://www.example.de时,我也被redirect到https://www.example.de ,这导致了我的内容cloud.example.com,因为这是唯一的服务器名设置为由端口443使用。
www-subdomain的访问日志中没有条目。
还有一个子域指向一个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。
你提供的示例configuration看起来是正确的,我怀疑它会像你描述的那样工作(当你尝试简化它时你可能做了太多的改变)。
你是否在curl或只在浏览器中得到错误的redirect? 我已经处理permanent永久caching在Mozilla中的情况(例如,从之前的nginx.conf ),没有任何方法使一个301caching条目无效,所以,你确定它不是caching问题吗?
在任何情况下,您也可以尝试使用if来使redirect有条件(也许第一个服务器被选为默认服务器):
if ($host = "cloud.example.de") { rewrite ^ https://$server_name$request_uri? redirect; } return 403;
或者,另一个select,
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 ,以确保你看到有什么。