用nginx把基址重写为https

我想只有我的基地域名www.domain.com被重写https://www.domain.com默认情况下,我的https地址块我重新路由到http://如果不是〜uri =“/” (基本域)或静态内容。

server { listen 443; set $ssltoggle 2; if ($uri ~ ^/(img|js|css|static)/) { set $ssltoggle 1; } if ($uri = '/') { set $ssltoggle 1; } if ($ssltoggle != 1) { rewrite ^(.*)$ http://$server_name$1 permanent; } } 

所以在我的http块我需要做重写,如果它有https:

 server { listen 80; if ($uri = '/') { set $ssltoggle 1; } if ($ssltoggle = 1) { rewrite ^(.*)$ https://$server_name$1 permanent; } } 

如果我没有在http块中使用$ uri ='/'if语句,那么如果直接转到https,那么https就可以正常工作,但是如果转到预期的常规http,则不会redirect。 如果我把这个声明放在http块中,那么一切都会在几分钟内停止。 它可能会为less数几个请求工作,但总是会在一分钟左右停止。 在浏览器中,我只是得到所有请求的空白页面。 如果我重新启动nginx,它将继续工作,直到我同时删除https和http块中的两个if语句块,然后重新启动nginx。 当我查看错误日志时,我没有看到任何logging。 当我查看访问日志时,看到以下消息:

 "-" 400 0 "-" "-" 

我认为这意味着400错误。 我不明白为什么这不适合我。 我的最终目标是让基本域名仅为https,而所有其他页面默认为http。 我怎样才能做到这一点?

我结束了$ uri更改$ request_uri所以参数可以处理没有redirect循环。

 server { listen 443; set $ssltoggle 2; if ($uri ~ ^/(img|js|css|static)/) { set $ssltoggle 1; } if ($request_uri = '/') { set $ssltoggle 1; } if ($ssltoggle != 1) { rewrite ^(.*)$ http://$server_name$1 permanent; } } 

然后我改变了http块来做一个立即重写,如果位置是= /

 server { listen 80; location = / { rewrite ^(.*)$ https://$server_name$1 permanent; } if ($ssltoggle = 1) { rewrite ^(.*)$ https://$server_name$1 permanent; } } 

我有IF声明仍然处理其他重写,然后所有具体的服务完成下面的。 这可能只是我的具体configuration,导致redirect循环和错误,当我试图处理一切,如克里斯托弗的build议或我最初提出的问题。

你不需要所有的if语句。 你应该使用位置声明。

 server { listen 80; #rewrite base (/) to ssl location = / { rewrite ^(.*)$ https://$server_name$1 permanent; } #serve anything else location / { [serve non-ssl page ...] } } server { listen 443; #serve base url location = / { [serve ssl page ...] } #serve assets location ~ ^/(img|js|css|static)/ { [serve ssl assets ...] } #rewrite anything else location / { rewrite ^(.*)$ https://$server_name$1 permanent; } } 

这是未经testing,可能Contian错误,但应该工作