javascript - nginx 1.14.0 Ubuntu 上的 400 错误请求
问题描述
设想:
我有两个网站admin.example.com
和www.example.com
. 管理网站使用 Django 2.2 开发,前端网站使用 Angular 8 开发。两个网站都在 Ubuntu 18 上配置了 Nginx 1.14.0。
问题:
我最近在这些网站上添加了 SSL。虽然管理站点运行良好,但前端显示 400 错误请求错误,并带有文本“普通 HTTP 请求已发送到 HTTPS 端口”。
我发现这个处理 nginx 400 "The plain HTTP request was sent to HTTPS port" 错误是相同的问题,但在我的情况下它不起作用。
我对 admin.example.com (Django) 的配置:
server {
listen 80;
server_name admin.example.com;
return 301 https://admin.example.com$request_uri;
}
server {
listen 443 ssl;
server_name admin.example.com;
ssl off;
ssl_certificate /root/ssl-bundle.crt;
ssl_certificate_key /root/example.com.key;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/raakesh/backend;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
example.com(Angular)的配置:
server {
listen 80 default_server;
server_name www.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 default_server ssl;
server_name www.example.com;
root /home/rohangular/websiteangular/dist/angular-website;
index index.html index.htm;
access_log /var/log/nginx/example.com/access.log;
error_log /var/log/nginx/example.com/error.log;
location / {
try_files $uri $uri/ /index.html;
}
location = /favicon.ico { access_log off; log_not_found off; }
ssl off;
ssl_certificate /root/ssl-bundle.crt;
ssl_certificate_key /root/example.com.key;
}
我还尝试使用以下方法记录此信息:
error_log /var/log/nginx/example.com/error.log 信息;
并在日志文件中找到了这个:
[info] 1533#1533: *247 客户端在读取客户端请求标头时向 HTTPS 端口发送纯 HTTP 请求,客户端:188.166.28.57,服务器:www.example.com,请求:“GET /main-es5.54e5eba613f299b8fae5.js HTTP /1.1”,主机:“www.example.com”
我面临的另一个有线问题是,这个 example.com 网站有时会自动开始工作,有时会显示 400 错误,如上所述。
当第一个工作时我无法理解,而第二个工作则不然。如果我做错了什么或错过了什么,请帮助我。
解决方案
该错误意味着您正在尝试访问http://example.com:443 ,这意味着您发送的是 HTTP 请求而不是 https 请求,可能是错字还是浏览器问题?
另外,根据 nginx 文档ssl off;在nginx 1.15之后被淘汰了,所以我会摆脱它。
添加以下内容很可能会解决您的问题:
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
最终配置应如下所示:
server {
listen 443 default_server ssl;
server_name www.example.com;
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
root /home/rohangular/websiteangular/dist/angular-website;
index index.html index.htm;
access_log /var/log/nginx/example.com/access.log;
error_log /var/log/nginx/example.com/error.log;
location / {
try_files $uri $uri/ /index.html;
}
location = /favicon.ico { access_log off; log_not_found off; }
ssl_certificate /root/ssl-bundle.crt;
ssl_certificate_key /root/example.com.key;
}
推荐阅读
- android - 如何为录音库创建自定义文件路径?
- android - 是否有任何替代意图为类(非活动)发送数据的方法?
- c# - .Net Core MVC 中有类似 RouteConfig.cs 的东西吗?
- python - AttributeError:“DisabledBackend”对象没有属性“_get_task_meta_for”
但这很好 - python - 具有多个输入的 Keras 网格搜索
- mongodb - MongoDB:按其他集合的总和对记录进行排序
- java - 使用 SQL Server 登录后保存用户会话
- python - Anaconda - 正在使用通道 conda-forge 搞砸整个环境?
- javascript - 将数组解析为输入值(全局 .JS 文件到特定的 HTML 页面)
- node.js - Schema 方法属性使用