现在的情况:

现在的情况:

现在的情况:

我已成功在我的 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 文件夹中有两个文件:

  1. example.conf(这是Serverpilot的标准配置文件,我没有改)
  2. 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. 重定向应限制为最多 1 步 (301 -> 200)
  2. 服务器应尽快执行重定向
  3. 配置文件应该受到保护以避免 serverpilot 更新,因此当 serverpilot 更新其系统时,不会覆盖任何文件,也不会发生错误。
  4. 最常见的浏览器(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;
}

相关内容