我有这样的配置:
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运行正常,但我无法将流量从 http 重定向到 https。当我执行此操作时:
server {
listen 80;
server_name example.pl *.example.pl;
#rewrite ^/(.*)$ http://www.example.pl/$1 permanent;
return 301 https://$server_name$request_uri;
}
这是重定向,但https://example.pl没有 www。如何正确重定向。我想要相同的配置,但使用 https。
这也不起作用:
server {
listen 80;
server_name example.pl *.example.pl;
rewrite ^/(.*)$ https://www.example.pl/$1 permanent;
}
答案1
您有两个问题:
首先,您从使用切换www.example.pl
到$server_name
(这就是www.
消失的原因)。
其次,您的其他服务器块已经在处理http://www.example.pl
。
listen 80;
从第二个块中删除server
,以便它仅处理https
连接。用于return 301 https://www.example.pl$request_uri;
执行重定向到正确的方案和服务器名称。
例如:
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;
...
}
答案2
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;
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;
从 SSLserver{}
部分中删除它,因为它已经变得不再必要了。