Erreur https du proxy inverse Nginx La requête HTTP simple a été envoyée à la solution de port HTTPS

Récemment, un site Web a été inversé via Nginx, et https a été configuré, et le navigateur a entré : https://xxxx.test.com pour y accéder, et l'erreur "400 Bad Request The plain HTTP request was sent to HTTPS port" est apparu, comme illustré dans la figure ci-dessous : Ceci
Veuillez ajouter une description de l'image
est apparu La raison principale de ce type d'erreur est :
parce que la requête HTTP est envoyée au port HTTPS, ce type d'erreur se produit principalement lorsque Nginx traite à la fois les requêtes HTTP et les requêtes HTTPS + c'est L'
accès normal au port 80 doit être : http://xxxx.test.com:80/login
Une fois HTTPS activé, l'accès au port 443 doit être : https://xxxx.test.com:443/ login
mais à ce moment il devient : http://xxxx.test.com:443/login, c'est-à-dire que la requête HTTP est envoyée au port HTTPS.

En termes simples : lors de la première demande d'accès au site xxxx.test.com via HTTP, la demande est redirigée vers HTTPS. Nginx s'attend donc à utiliser SSL (port 443) pour interagir, mais la requête d'origine (reçue via le port 80, c'est-à-dire qu'il est vérifié qu'elle n'est pas connectée et qu'elle doit passer de / à /login) est un HTTP ordinaire demande, donc une erreur se produira.

La solution consiste à ajouter deux paramètres à la configuration d'origine :

proxy_set_header X-Forwarded-Proto https; # L'en-tête X-Forwarded-Proto (XFP) est utilisé pour identifier le protocole HTTP ou HTTPS, c'est-à-dire l'en-tête standard que le client utilisateur connecte réellement au proxy ou à l'équilibrage de charge.
proxy_redirect http:// https:// # proxy_redirect Cette commande est utilisée pour modifier le champ d'en-tête Location et le champ d'en-tête "refresh" dans l'en-tête de réponse renvoyé par le serveur proxy, c'est-à-dire changer le protocole http en protocole https.

La configuration complète après ajout est la suivante :

upstream  xxxx.test.com{
    
         
    #1、轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 
    #2、weight 指定轮询几率,weight和访问比率成正比
	#3、ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
	#ip_hash
	server   127.0.0.1:8808 weight=1;   
}
server {
    
    
    #keepalive_requests 120; #单连接请求上限次数。
	listen       80;   #监听端口
	#访问域名
	server_name  xxxx.test.com; #监听地址       
	#charset koi8-r;
	#access_log  logs/host.access.log  main;
	client_max_body_size 100m;
    location / {
    
    
		 proxy_pass http://xxxx.test.com;
proxy_set_header X-Original-Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host xxxx.test.com:$server_port;
		# proxy_set_header Host $host:$server_port;
		# proxy_set_header X-Real-IP $remote_addr;
		# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		# proxy_redirect  off;  
		 proxy_connect_timeout 18000;
		 proxy_send_timeout 18000;
		 proxy_read_timeout 18000;
		 #fastcgi_param HTTPS on; 

	}
  
    add_header X-Cache $upstream_cache_status;
    proxy_cache_key $host$uri$is_args$args;
    if ($scheme = http) {
    
    
        return 301 https://$host$uri?$args;
     }
	#error_page  404              /404.html;

	# redirect server error pages to the static page /50x.html
	#
	error_page   500 502 503 504  /50x.html;
	location = /50x.html {
    
    
		root   html;
	}

}


	server {
    
    
        #https
        listen       443 ssl;
        server_name  xxxx.test.com; #监听地址
        ssl_certificate     /usr/local/nginx/key/8024886_xxxx.test.com.pem;
        ssl_certificate_key  /usr/local/nginx/key/8024886_xxxx.test.com.key;
        #ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers  on;
        #访问域名
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        client_max_body_size 20m;
    location / {
    
    
        proxy_set_header X-Original-Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header Host xxxx.test.com:$server_port;
	proxy_set_header X-Forwarded-Proto https;

                 proxy_pass http://xxxx.test.com;

          proxy_redirect http:// https://;      

        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
    
    
                root   html;
        }

}







Guess you like

Origin blog.csdn.net/wenwang3000/article/details/127275544