普通 HTTP 请求已发送到 HTTPS 端口

普通 HTTP 请求已发送到 HTTPS 端口

我有下一个 NGINX 代理配置

http {
    server_tokens off;
server {
    listen     7443 ssl;
    ssl_certificate     /etc/nginx/ssl/star.crt;
    ssl_certificate_key /etc/nginx/ssl/star.key;
    location /prometheus/ {
      auth_basic           "Prometheus";
      auth_basic_user_file /etc/nginx/.htpasswd;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      # I leave this hardcoded for now
      proxy_pass http://prometheus:9090/prometheus/;
   }

    location / {
      auth_basic           "Prometheus";
      auth_basic_user_file /etc/nginx/.htpasswd;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      # I leave this hardcoded for now
      proxy_pass http://alertmanager:9093;
   }
 }
}
events {}

如果我在浏览器 URL 中输入未指定 HTTPS 且使用端口 7443 的 URL,则会得到:

The plain HTTP request was sent to HTTPS port

例如:prometheus.example.com:7443/prometheus/ 或 prometheus.example.com:7443/#/alerts/

如果我指定没有 HTTPS 的 URL,如何让 NGINX 自动重定向到 HTTPS?

答案1

其实解决方案很简单。在“listen”字符串下的服务器部分中,我只需要添加:

error_page 497 https://$host:$server_port$request_uri;

497 代码是发送到 HTTPS 端口的 HTTP 请求。error_page 处理此代码并重定向到 https://$host:$server_port$request_uri;

在哪里:

$host 是保留变量,代表运行 NGINX 的主机名。

$server_port 是保留变量,代表在服务器部分声明的列表端口。

$request_uri 是保留变量,代表完整的原始请求 URI(带有参数)。

答案2

当您输入时,prometheus.example.com:7443/prometheus/浏览器会尝试发送 http 请求。尝试https://prometheus.example.com:7443/prometheus/

相关内容