Nginx httpredirect到https

我有这样的configuration:

server { listen 80; server_name example.pl *.example.pl; rewrite ^/(.*)$ http://www.example.pl/$1 permanent; } server { listen 80; listen 443 ssl; ssl on; ssl_certificate /opt/nginx/ssl/server.pem; ssl_certificate_key /opt/nginx/ssl/server.key; server_name www.example.pl; root /var/www/example/public/; # <--- be sure to point to 'public'! } 

所以现在每个像xx234.example.pl这样的子域都被重写为http://www.example.pl

现在我尝试设置https。 https://www.example.pl工作正常,但我不能将stream量从httpredirect到https。 当我这样做:

 server { listen 80; server_name example.pl *.example.pl; #rewrite ^/(.*)$ http://www.example.pl/$1 permanent; return 301 https://$server_name$request_uri; } 

这是redirect,但没有www的https://example.pl 。 如何正确redirect。 我想要有相同的configuration,但与https。

这也不起作用:

 server { listen 80; server_name example.pl *.example.pl; rewrite ^/(.*)$ https://www.example.pl/$1 permanent; } 

你有两个问题:

首先你从使用www.example.pl切换到$server_name (这就是www.消失的原因)。

其次,您的其他服务器块已经在处理http://www.example.pl

删除listen 80; 从第二个server块,以便它只处理https连接。 使用return 301 https://www.example.pl$request_uri; 执行redirect到正确的scheme和服务器名称。

例如:

 server { listen 80; server_name example.pl *.example.pl; return 301 https://www.example.pl$request_uri; } server { listen 443 ssl; server_name www.example.pl; ... } 

server_name设置虚拟服务器的名称,例如:

 server { server_name example.com www.example.com; } 

名字成为主要的服务器名称。

现在,因为你有server_name example.pl *.example.pl;example.pl已成为你在你的主要服务器名称

 return 301 https://$server_name$request_uri; 

这不是一个惊喜,redirect到example.pl而不是www.example.pl 。 要改变它,只需在开头添加www.example.pl

 server { listen 80; server_name www.example.pl example.pl *.example.pl; return 301 https://$server_name$request_uri; } 

现在你也可以删除listen 80; 从您的SSL server{}部分,因为它已成为不必要的。