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

Неправильная или неправильно настроенная перезапись с помощью nginx 1.8

У меня есть 2 файла конфигурации nginx ssl.conf и default.conf под /etc/nginx/conf.d/. Первый файл обрабатывает входящий HTTP-запрос. Он перезаписывает http-запрос на https. И ssl.conf файл обрабатывает запросы на основе https.

Ниже показано, как default.conf это выглядит как

server {
    listen       80 default_server;
    server_name  abc.example.com 123-abc.example.com;

    port_in_redirect off;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


    set_real_ip_from 127.0.0.1;
    set_real_ip_from 10.0.0.0/8;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;   

    location /about {
      root /usr/share/nginx/html;
      add_header X-Frame-Options "DENY";
      try_files $uri /about.html;
    }

    location /webapi {
      add_header X-Frame-Options "DENY";
    }

    location / {
      rewrite        ^ https://$server_name$request_uri? permanent;
    }
}

Проблема здесь в том, abc.example.com/to/some/path переписывает на https://abc.example.com/to/some/path Это ожидаемый результат.

Но

123-abc.example.com/to/some/path также переписывает на https://abc.example.com/to/some/path и НЕ https://123-abc.example.com/to/some/path

Я пытаюсь иметь 2 URL-адреса, которые работают одинаково, установив 2 разных server_names в качестве псевдонима. Они не предназначены для обслуживания разных страниц / веб-сайтов.

Вот ваше переписывание:

      rewrite        ^ https://$server_name$request_uri? permanent;

Проблема в том, что вы использовали $server_name, который является не именем хоста HTTP, запрошенным браузером, а первым server_name определено в server блок.

Чтобы исправить это, измените его на $http_host, которое является именем хоста, запрошенным браузером.

      rewrite        ^ https://$http_host$request_uri? permanent;

А еще лучше не использовать rewrite вообще. Достаточно return 301.

      return 301 https://$http_host$request_uri$is_args$args;