添加 letsencrypt 后,我尝试获取正确的重定向 http://example.com和https://example.com到https://www.example.com
https//example.com 至https://www.example.com不管用..
另外,我是否需要为 www 和非 www 提供单独的标签?或者 server_name example.com www.example.com 可以吗?
我应该为 mydomain.com 生成 letsencrypt 证书吗?
请提供建议并提前致谢。
server {
server_name domain.com;
return 301 https://www.example.com$request_uri;
}
server {
server_name www.example.com;
access_log /srv/www/example.com/logs/access.log;
error_log /srv/www/example.com/logs/error.log;
root /srv/www/example.com/public_html;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;$
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pe$
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = www.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
答案1
首先要彻底摆脱它。这是 Nginx 配置中很糟糕的一部分,我不知道 Certbot 的好心人为什么要包含它。
server {
if ($host = www.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
您可以更改顶级服务器块以捕获所有非 https 连接并重定向它们,如下所示:
server {
listen 80 default_server;
return 301 https://www.example.com$request_uri;
}
但是,即使有人只输入您的服务器 IP,这也将捕获端口 80 上的所有请求。如果您不希望这样,而只想捕获您域的流量,则需要两个服务器块,一个用于您的域,一个用于其他所有服务器,如下所示:
server {
listen 80 default_server;
return 444;
}
server {
listen 80;
server_name www.example.com example.com;
return 301 https://www.example.com$request_uri;
}
这就是您处理的所有 http 流量。有几种方法可以执行 SSL 重定向,您需要一个包含 www 和非 www 域名的组合证书,或者每个证书一个。如果您获得组合证书,则列出域名的顺序可能很重要。由于您打算使用 www,因此将其列为第一个域名。
然后在底部添加另一个服务器块以捕获非 www 域并重定向,如下所示:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate ....
ssl_certificate_key ....
return 301 https://www.example.com$request_uri;
}