ASP. NET Core 가 Https Redirection 에서 Nginx 를 만 났 을 때 실패 한 문 제 를 해결 합 니 다.

3801 단어 .netapi2.0core
ASPNET 코어 전치 Nginx 해결 시 HttpsRediection 실패 문제
  • 일반적인 표기 법
  • 해결 방법
  • 일반적인 표기 법
    public void ConfigureServices(IServiceCollection services)
            {
            //       ,     
                services.AddHttpsRedirection(options=>{
                    options.HttpsPort=443;
                    options.RedirectStatusCode= StatusCodes.Status307TemporaryRedirect;
                });
                services.Configure(options =>
                {
                    options.CheckConsentNeeded = context => true;
                    options.MinimumSameSitePolicy = SameSiteMode.None;
                });
                services.AddMvc(options =>
                {
                    options.Filters.Add(typeof(GlobalExceptionFilterAttribute));
                }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);          
            }
    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                        app.UseHttpsRedirection();
                        app.UseMvc(routes =>
    		            {
    		                routes.MapRoute(
    		                    name: "default",
    		                    template: "{controller=Home}/{action=Index}/{id?}");
    		            });
            }
    

    이 때 Nginx 가 미리 설정 되 어 있 을 때, Nginx 가 Https 를 분석 하지 않 고 간단하게 전송 할 때 (설정 은 대략 다음 과 같 습 니 다) 무한 한 리 셋 에 빠 집 니 다. Nginx 가 Https 리 트 윗 을 설정 하지 않 으 면 기본적으로 Http 의 Scheme 을 리 셋 합 니 다. http 대신 http 을 사용 합 니 다.
    ps: 왜 Nginx 에서 Https 를 분석 하지 않 는 지, 메시지 의 복호화 에 자원 이 많이 소모 되 기 때문에 Nginx 는 퍼 가기 와 부하 의 관건 으로 Https 의 해석 을 맡 으 면 성능 이 어느 정도 떨 어 질 수 있 으 며, 응용 프로그램 에 분산 되 어 분석 하면 성능 소모 가 분 산 됩 니 다. 따라서 생산 라인 과정 에서 Nginx 에서 Https 를 분석 하 는 것 을 추천 하지 않 습 니 다.
    server {
        listen        443;
        server_name   example.com *.example.com;
        location / {
            proxy_pass         http://localhost:5000;
            proxy_http_version 1.1;
            proxy_set_header   Upgrade $http_upgrade;
            proxy_set_header   Connection keep-alive;
            proxy_set_header   Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
    

    해결 방법
  • Nginx proxy 추가set_header X-Forwarded-Proto $scheme;
  • server {
        listen        443;
        server_name   example.com *.example.com;
        location / {
            proxy_pass         http://localhost:5000;
            proxy_http_version 1.1;
            proxy_set_header   Upgrade $http_upgrade;
            proxy_set_header   Connection keep-alive;
            proxy_set_header   Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    
            proxy_set_header   X-Forwarded-Proto $scheme;
        }
    }
    
  • Forward 설정 추가
  • public void ConfigureServices(IServiceCollection services)
            {
            	//....
    			services.Configure(options =>
    			            {
    			                options.ForwardedHeaders =
    			                    ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
    			            });
     		}
    
  • Forward 사용
  • public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
            			//...
           			    app.UseForwardedHeaders();
                        app.UseHttpsRedirection();
                        app.UseMvc(routes =>
    		            {
    		                routes.MapRoute(
    		                    name: "default",
    		                    template: "{controller=Home}/{action=Index}/{id?}");
    		            });
            }
    

    이로써 http 요청 은 Nginx 를 건 너 뛰 어 ASPNET 코어 로 직접 이동 하고 Https 로 재 설정 하여 Nginx 와 의 퍼 가기 효율 을 확보 하 는 동시에 재 설정 을 실현 할 수 있 습 니 다.

    좋은 웹페이지 즐겨찾기