解决Nginx中的“纯HTTP请求发送到HTTPS端口”错误

在本文中,我们将展示如何解决Nginx HTTP服务器中的“ 400错误请求:HTTP请求被发送到HTTPS端口 ”。 当您尝试配置Nginx来处理HTTP和HTTPS请求时,通常会出现此错误。

就本指南而言,我们正在考虑一个场景,其中nginx通过服务器块 (或Apache中的虚拟主机 )为多个网站提供服务,而只有一个网站使用SSL,其余网站则不使用SSL。

另请参阅保护,加固和提高Nginx性能的终极指南

我们还会考虑下面的示例SSL配置(出于安全原因,我们已经更改了实际的域名),它告诉nginx同时监听端口80443 并且HTTP上的所有请求都应该默认重定向到HTTPS。

Nginx的示例配置

server{
listen 80;
server_name example.com www.example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
root   /var/www/html/example.com/;
index index.php index.html index.htm;
#charset koi8-r;
access_log /var/log/nginx/example.com/example.com_access_log;
error_log   /var/log/nginx/example.com/example.com_error_log   error;
# SSL/TLS configs
ssl on;
ssl_certificate /etc/ssl/certs/example_com_cert_chain.crt;
ssl_certificate_key /etc/ssl/private/example_com.key;
include /etc/nginx/ssl.d/ssl.conf;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
error_page   500 502 503 504  /50x.html;
location = /50x.html {
root   /var/www/html/example.com/;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
#    proxy_pass   http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root   /var/www/html/example.com/;
fastcgi_pass   127.0.0.1:9001;
#fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
include         fastcgi_params;
include /etc/nginx/fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
#    deny  all;
#}
}

使用上述配置,一旦客户端尝试通过端口80(http://example.com访问您的站点,相关错误将显示在下面的屏幕截图中。

Nginx的404错误请求错误

您遇到此错误,因为每当客户端尝试通过HTTP访问您的站点时,请求都被重定向到HTTPS。 这是因为nginx希望在事务中使用SSL,但原始请求t(通过端口80接收)是普通的HTTP,它抱怨错误。

另一方面,如果客户端使用https://example.com ,他们将不会遇到上述错误。 另外,如果你有其他网站配置为不使用SSL,nginx会默认使用HTTPS,导致上述错误。

要解决这个错误,请在您的配置中将下面的行注释掉,或者将其设置为off。

#ssl on 
OR
ssl off

保存并关闭文件。 然后重新启动nginx服务。

# systemctl restart nginx
OR
$ sudo systemctl restart nginx

这样,您可以启用nginx来处理多个服务器块的HTTP和HTTPS请求。

最后,下面是在常见Linux发行版和FreeBSD上设置SSL HTTPS的文章列表。

  1. 让我们在RHEL / CentOS上为Nginx加密SSL证书来设置HTTPS
  2. 免费保护Nginx让我们在Ubuntu和Debian上加密SSL证书
  3. 如何使用SSL保护Nginx,让我们在FreeBSD中加密

目前为止就这样了。 如果您知道解决此错误的其他方法,请通过下面的反馈表告诉我们。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏