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

Как определить ssl в общей конфигурации сервера ssl nginx 80/443?

Когда сервер nginx настроен таким образом:

server {
  listen 80;
  listen 443 ssl;
  server_name www.example.org;
  ...
}

как определить, что запрос пришел через HTTP или HTTPS?

(Например. $http_port непригоден для использования, потому что порт явно не указан, поэтому он пуст)

http://nginx.org/en/docs/http/ngx_http_core_module.html#variables

  • $ https - «включено», если соединение работает в режиме SSL, или пустая строка в противном случае
  • $ scheme - схема запроса, «http» или «https»

Например, если вы хотите ограничить местоположение до https и только:

location /admin {
    if ($https = "") {
        return 404;
    }
    # ... and so on
}

Почему бы не разделить каждую на отдельную директиву сервера и указать журнал для каждого контекста сервера:

server {
  listen           80;
  server_name      www.nginx.org;
  log_format gzip '$remote_addr - $remote_user [$time_local]  '
                  '"$request" $status $bytes_sent '
                  '"$http_referer" "$http_user_agent" "$gzip_ratio"';

  access_log  /spool/logs/nginx-access.log  gzip  buffer=32k;
  error_log /var/log/nginx/nginx-error.log error;
}

server {
  listen           443 default_server ssl;
  server_name      secure.nginx.org;
  log_format gzip '$remote_addr - $remote_user [$time_local]  '
                  '"$request" $status $bytes_sent '
                  '"$http_referer" "$http_user_agent" "$gzip_ratio"';

  access_log  /var/log/nginx/nginx_ssl-access.log  gzip  buffer=32k;
  error_log /var/log/nginx/nginx_ssl-error.log error;
}

Затем вы можете просматривать каждый журнал отдельно, чтобы узнать, откуда произошел доступ или ошибка.