Когда сервер 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; }
Затем вы можете просматривать каждый журнал отдельно, чтобы узнать, откуда произошел доступ или ошибка.