«Удалите следующую цепочку перенаправления, если возможно» на 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 и пройти тест.

Обновлено: Full .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";
  }
}
3
задан 20 February 2017 в 11:38
2 ответа

Просто измените $ 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 насколько это возможно (прочтите If is Evil ).

0
ответ дан 3 December 2019 в 08:27

Думаю, ваше имя 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;
        }
    }
}
-1
ответ дан 3 December 2019 в 08:27

Теги

Похожие вопросы