在本文中,我们将展示如何解决Nginx HTTP服务器中的“ 400错误请求:HTTP请求被发送到HTTPS端口 ”。 当您尝试配置Nginx来处理HTTP和HTTPS请求时,通常会出现此错误。
就本指南而言,我们正在考虑一个场景,其中nginx通过服务器块 (或Apache中的虚拟主机 )为多个网站提供服务,而只有一个网站使用SSL,其余网站则不使用SSL。
另请参阅 : 保护,加固和提高Nginx性能的终极指南
我们还会考虑下面的示例SSL配置(出于安全原因,我们已经更改了实际的域名),它告诉nginx同时监听端口80和443 。 并且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的文章列表。
- 让我们在RHEL / CentOS上为Nginx加密SSL证书来设置HTTPS
- 免费保护Nginx让我们在Ubuntu和Debian上加密SSL证书
- 如何使用SSL保护Nginx,让我们在FreeBSD中加密
目前为止就这样了。 如果您知道解决此错误的其他方法,请通过下面的反馈表告诉我们。