Назад | Перейти на главную страницу

«Если возможно, удалите следующую цепочку переадресации» на Nginx

Я запустил тест Pingdom на своем 1 простом сайте с файлом html и получил за это оценку 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";
  }
}

Просто измени $scheme к https, Я не могу сказать, почему это вообще так, потому что вы вряд ли получите что-либо, кроме 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;
}

Ответ Ашиша может сработать, но я бы держался подальше от if как можно больше (читать Если это зло).

Я предполагаю, что ваше имя 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;
        }
    }
}