Nginx 上的“如果可能,删除以下重定向链”

Nginx 上的“如果可能,删除以下重定向链”

我在我的 1 个纯 html 文件网站上运行了 Pingdom 测试,得到了 F 评级:

如果可能,请删除以下重定向链:

http://example.com/
http://www.example.com/
https://www.example.com/

我的 .conf 中唯一的重定向是:

server {
  listen 80;
  server_name example.com;
  return 301 $scheme://www.example.com$request_uri;
}

下一个块是 SSL 和其余部分。

server {
  listen 443 ssl http2;
  etc...
}

没有其他配置。我所需要的只是将非 www 重定向到 www 并始终仅使用 https 并通过测试。

已更新:完整 .conf

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

server {
  listen 443 ssl http2;

  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ssl_ciphers 'EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5';
  ssl_dhparam /etc/nginx/ssl/dhparams.pem;
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:50m;
  ssl_stapling on;
  ssl_stapling_verify on;
  add_header Strict-Transport-Security max-age=15768000;

  root /var/www/example.com/htdocs;

  server_name example.com www.example.com;

  location / {
    autoindex on;
    try_files $uri $uri/ =404;
  }

  location ~* /img/.*\.gif$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
  }
}

答案1

只需更改$schemehttps,我无法说出为什么它首先在那里,因为http除非您的用户做了一些奇怪的事情,否则您不太可能通过端口 80 获得任何其他东西。

编辑:添加缺少的 https->https 重定向。

没有注意到你实际上没有明确的default_server。按照以下方式进行:

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

ifAshish 的答案可能有用,但我会尽可能远离(阅读如果是邪恶的)。

答案2

我猜你的 godaddy cname 或 A 记录对于 nginx 来说没问题,请尝试下面的代码。

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    if ($http_x_forwarded_proto != 'https') {
          rewrite ^(.*) https://www.example.com$1 redirect;
    }
}

如果你想一次性完成,那么可以使用这种方式,但这是解决这个问题的非常糟糕的方法。在服务器 80 块上的配置和位置块顶部添加地图模块。

map $http_host $new {
    'www.abc.com' '1';
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    if ($http_x_forwarded_proto != 'https') {
        rewrite ^(.*) https://$host$1 redirect;
    }
    location / {
        if ($new != '1') {
            rewrite ^(.*) https://www.example.com$1 redirect;
        }
    }
}

相关内容