如何用Play替换Nginx默认错误400“纯HTTP请求已发送到HTTPS端口”页面!框架后端。

时间:2018-09-29 22:16:36

标签: nginx playframework

我有一个使用Play的网站!具有多个域的框架,代理到后端example.com和example.ca。

我将端口80上的所有http请求都重写为端口443上的https。所有请求均按预期工作。

但是,当我在地址栏http://example.com:443中键入内容时,将显示nginx的默认错误页面,该页面显示为

400 Bad Request
The plain HTTP request was sent to HTTPS port
nginx

我想为此提供自己的错误页面,但似乎无法正常工作。这是我的配置的一部分。

upstream my-backend {
  server 127.0.0.1:9000;
}

server {
  listen                  443;
  ssl                     on;

  ssl_certificate        /etc/ssl/certs/example.crt;
  ssl_certificate_key    /etc/ssl/private/example.key;
  keepalive_timeout       70;
  server_name             example.com;
  add_header              Strict-Transport-Security max-age=15768000; #six months


  location / {
    proxy_pass              http://my-backend;
  }

  error_page 400 502 error.html;
  location = /error.html {
    root /usr/share/nginx/html;
  }



}

在我玩游戏时可以使用!应用程序已关闭,但是在运行时,它将始终提供默认的nginx页面。

我尝试将错误页面配置添加到这样的另一个服务器块中

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

  error_page [..]

}

但是由于浏览器抱怨证书错误而失败。

我真的很希望最终能够捕获并处理Play无法解决的任何错误!具有一个或多个自定义页面的应用程序。如果用户在地址栏中而不是服务器名称中手动输入站点的IP,我也希望此解决方案能够起作用。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我在https://stackoverflow.com/a/12610382/4023897处找到了答案。

在我的特殊情况下,在这种情况下,我想提供一个静态错误页面,我的配置如下

server {
  listen                  443;
  ssl                     on;  

  ssl_certificate        /etc/ssl/certs/example.crt;
  ssl_certificate_key    /etc/ssl/private/example.key;
  keepalive_timeout       70;
  server_name             example.com;
  add_header              Strict-Transport-Security max-age=15768000; #six months


  location = /error.html {
    root /usr/share/nginx/html;
    autoindex off;
  }

  location / {
    proxy_pass              http://my-backend;
  }

  # If they come here using HTTP, bounce them to the correct scheme
  error_page 497 https://$host:$server_port/error.html;


}