当 nginx 服务器这样配置时:
server {
listen 80;
listen 443 ssl;
server_name www.example.org;
...
}
如何检测请求是通过 HTTP 还是 HTTPS 发送的?
(例如$http_port
无法使用,因为没有明确指定端口,因此它是空的)
答案1
http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
- $https — 如果连接在 SSL 模式下运行,则为“on”,否则为空字符串
- $scheme — 请求方案,“http” 或 “https”
例如,如果您希望将位置限制为 https 并且仅:
location /admin {
if ($https = "") {
return 404;
}
# ... and so on
}
答案2
为什么不将每个指令分离到自己的服务器指令中并为每个服务器上下文指定一个日志:
服务器 { 听80; 服务器名称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 缓冲区=32k; error_log /var/log/nginx/nginx-error.log 错误; } 服务器 { 监听443默认服务器ssl; 服务器名称 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 缓冲区=32k; error_log /var/log/nginx/nginx_ssl-error.log 错误; }
然后,您可以单独查看每个日志以查看访问或错误来自何处。
答案3
我的答案晚了 10 年 ;-)
您可以使用 nginx 变量 $server_port。类似这样的:
if ($server_port = "80") {
return 404;
}
if ($server_port = "443") {
return 301 /index.php;
}
祝你好运。