现在的情况:
我已成功在我的 Serverpilot (nginx/apache) 服务器上手动设置 SSL 证书。由于我的网站在 Serverpilot 服务器上运行,因此它部分是 nginx,部分是 Apache。我可以在我的服务器上使用 Apache 进行所有重定向,但我更喜欢在我的 nginx 配置文件中以正确的方式进行重定向,因为我读到过这是更有效的方法。
由于 nginx 由 serverpilot 管理,因此我必须在单独的 nginx 配置文件中进行更改,该文件位于我服务器上的此文件夹中:/etc/nginx-sp/vhosts.d。如您所见,Serverpilot 不使用标准 nginx 配置,Serverpilot 安装附带了 Serverpilot 配置文件。
这个 /etc/nginx-sp/vhosts.d 文件夹中有两个文件:
- example.conf(这是Serverpilot的标准配置文件,我没有改)
- example.ssl.conf(这是我用 ssl 规则创建的文件)
据我所知,Nginx 首先读取第一个 .conf,然后读取第二个 .conf。对吗?
example.conf(Serverpilot 标准配置文件)包含以下内容:
server {
listen 80;
listen [::]:80;
server_name
server-example
example.net
www.example.net
;
root /srv/users/serverpilot/apps/example/public;
access_log /srv/users/serverpilot/log/example/example_nginx.access.log main;
error_log /srv/users/serverpilot/log/example/example_nginx.error.log;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
include /etc/nginx-sp/vhosts.d/example.d/*.nonssl_conf;
include /etc/nginx-sp/vhosts.d/example.d/*.conf;
}
我创建了一个包含以下内容的 example.ssl.conf:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.net www.example.net;
ssl on;
# certificates
ssl_certificate /etc/nginx-sp/certs/example.net/example.net.chained.crt;
ssl_certificate_key /etc/nginx-sp/certs/example.net/example.net.key;
#SSL Optimization
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:20m;
ssl_session_tickets off;
# modern configuration
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
# verify chain of trust of OCSP response
ssl_trusted_certificate /etc/nginx-sp/certs/example.net/example.net.chained.crt;
#root directory and logfiles
root /srv/users/serverpilot/apps/example/public;
access_log /srv/users/serverpilot/log/example/example_nginx.access.log main;
error_log /srv/users/serverpilot/log/example/example_nginx.error.log;
#proxyset
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-SSL on;
proxy_set_header X-Forwarded-Proto $scheme;
#includes
include /etc/nginx-sp/vhosts.d/example.d/*.nonssl_conf;
include /etc/nginx-sp/vhosts.d/example.d/*.conf;
}
我已经使用此配置测试了重定向链
我已经通过填写所有可能的 url 组合来测试重定向https://httpstatus.io/。这是测试结果:
url statuscodes
url with http + www 301 → 200 (1 redirect)
url with http 301 → 200 (1 redirect)
url with https + www 301 → 200 (1 redirect)
url with https 200 (0 redirect)
我的问题是:从 http + www 到 https 的重定向是一步完成的。这样对吗?如果我测试其他几个网站,总会有一个重定向分两步进行。所以在我的情况下,从 http + www 的 url 重定向应该是:301 → 301 → 200(2 次重定向)
我是不是哪里搞错了?或者这是最佳解决方案?
我希望你能帮助我。
问候,Jan
目标
- 重定向应限制为最多 1 步 (301 -> 200)
- 服务器应尽快执行重定向
- 配置文件应该受到保护以避免 serverpilot 更新,因此当 serverpilot 更新其系统时,不会覆盖任何文件,也不会发生错误。
- 最常见的浏览器(Chrome、Firefox、IE、Safari)应该接受重定向
我在一篇文章中读到过:https://serverfault.com/a/258424/377649“实现此目的的最佳方式是使用三个服务器块:一个用于将 http 重定向到 https,一个用于将 https www 名称重定向到 no-www,一个用于实际处理请求。”
答案1
你为什么要玩 .htaccess 文件?那是 Apache,不是 Nginx。
以下是在 Nginx 中执行重写规则的一般方法。这将进入您的站点配置文件。
location /path/ {
return 301 https://www.example.com/path/;
}
以下是如何重定向到根域的方法,使用两个位置块
server {
listen 443 ssl http2; # http2 only if you built that module in
server_name www.example.com;
ssl_certificate /path/to/file;
ssl_certificate_key /path/to/file;
# Insert other SSL configuration
return 301 https://example.com$request_uri;
}
server {
listen 80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri;
}