Перенаправить все http на https в nginx, кроме одного файла

В настоящее время я запускаю свой сайт на http и хочу переместить его на https, так что nginx автоматически выполняет перенаправление. Я думаю, это довольно тривиально.

Однако есть один файл, который (по нескольким причинам) связан с другими сайтами, некоторые из которых находятся поверх http, а некоторые - по https. Я хочу убедиться, что файл доступен как для http, так и для https, чтобы гарантировать, что браузеры не жалуются на диалог "смешанный контент". Путь файла выглядит примерно так:

HTTP (S)://mydomain.com/scripts/[some_sha1_hash]/file.js

Итак, в правиле nginx следует сказать: "Если запрос уже превышен https, все сладко, а просто обратное-прокси-сервер. В противном случае перенаправляйте все запросы с http на https, за исключением случаев, когда этот один файл запрашивается, в в этом случае не нужно перенаправлять http- > https."

Может ли кто-нибудь сказать мне, где искать информацию о такой конфигурации, или помочь мне с самой конфигурацией? Заранее спасибо. (Извините, но я еще недостаточно подготовлен к конфигурации nginx.)

Ответ 1

Это то, что я сделал, что работает:

server {
    listen 80;
    server_name example.com;
    charset     utf-8;
    access_log /var/www/path/logs/nginx_access.log;
    error_log /var/www/path/logs/nginx_error.log;

    location /path/to/script.js {
          # serve the file here
    }
    location / {
        return 301 https://example.com$request_uri;
    }
}

Этот обрабатывает только HTTP-запросы и обслуживает указанный файл - в противном случае перенаправляется на https. Определите блок сервера ssl, который будет обслуживать все запросы https.

server {
   listen         443;
   server_name    example.com;

   ssl            on;

  # rest of the config
}

Таким образом, ваш файл script будет доступен как на http, так и на https.

Ответ 2

Попробуйте следующее:

server {
  listen 80; ssl off;
  listen 443 ssl;
  server_name example.com;

  # <ssl settings>
  # ... other settings

  location = /scripts/[some_sha1_hash]/file.js {
    # Empty block catches the match but does nothing with it
  }

  location / {
    if ($scheme = "http") {
      rewrite ^ https://$http_host$request_uri? permanent;
    }

    # ... other settings
  }
}

Ответ 3

server {
   listen         80;
   server_name    my.domain.com;
   rewrite        ^ https://$server_name$request_uri? permanent;
}

server {
   listen         443;
   server_name    my.domain.com;

   ssl            on;

   [....]
}

Вышеупомянутое должно в основном делать трюк, если im не ошибается