stylesheet 컨트롤러에서 ArgumentError(Time와 String 비교 실패) 발생

Apache를 리버스 프록시로 사용하는, 꽤 전형적인 서브폴더/리버스 프록시 구성을 사용하고 있습니다.

처음에는 보안이 되지 않는 자산(insecure assets) 문제가 있어서 ENV에 forced_https를 설정했습니다. 그런데 stylesheets/color_definitions_light_7_1_6cfae4de9c47a1b8ed3d5748018236d10ea9107e.css?__ws=site.com 같은 자산을 가져올 때 문제가 생겼습니다.

아마 제가 무언가 바보 같은 짓을 하고 있는 것 같은데, 다음과 같은 오류가 나고 있습니다:

ArgumentError (comparison of Time with String failed)
app/controllers/stylesheets_controller.rb:66:in `<='
app/controllers/stylesheets_controller.rb:66:in `show_resource'
app/controllers/stylesheets_controller.rb:19:in `show'
app/controllers/application_controller.rb:414:in `block in with_resolved_locale'
app/controllers/application_controller.rb:414:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:74:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:369:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:228:in `call'
1개의 좋아요

음,

을 살펴보면 stylesheet_time이 문자열인 것 같습니다. 따라서 해당 줄을 다음과 같이 변경하면 문제가 해결됩니다.

    if cache_time && stylesheet_time && stylesheet_time.to_date <= cache_time

최근 이 부분에 영향을 미치는 커밋을 발견하지 못했기 때문에, 현재 이 문제가 어떻게 발생하고 있는지 이해가 되지 않습니다.

즉, 값이 설정되는 방식은 다음과 같습니다:

    stylesheet_time = query.pick(:created_at)

:created_at은 적절히 날짜 형식일 것 같은데, 어떤 기반 지엠(gem)이 변경된 걸까요? 그리고 이것이 테스트에서 어떻게 잡히지 못했을까요?

1개의 좋아요

다음은 문제를 해결하는 것으로 보입니다:

    if !cache_time.to_date.nil? && !stylesheet_time.to_date.nil? 
      if (stylesheet_time.to_date <= cache_time.to_date)
        return render body: nil, status: 304
      end 
    end

to_date가 truthy인 값을 nil 날짜로 변환할 수 있는 것 같습니다.

아니요. 그것도 작동하지 않습니다. 결국 해당 부분을 begin/rescue/end로 감쌌습니다.

이것이 왜 이 서브폴더/리버스 프록시된 사이트에만 영향을 미치는지 매우 혼란스럽습니다.

아마도 다음 코드와 관련이 있을 수 있습니다.

      cache_time = request.env["HTTP_IF_MODIFIED_SINCE"]

그리고 아마도 Apache에서 이를 전달하지 않거나, 잘못된 날짜 문자열이 전달되고 있는 것 같습니다.

과거에는 여기에 rescue nil이 있었지만, 그것은 5년 전 이야기입니다.

또한 캐시이기 때문에 디버깅이 어려운 것 같습니다. 작동하는지 테스트하려면 캐시를 플러시해야 합니다.

1개의 좋아요

저도 같은 문제를 겪었습니다 (서브폴더 설정을 사용할 때도 그랬습니다). 무관한 혼합 콘텐츠 경고를 force_https 설정을 true로 변경하여 수정한 후, 문제가 사라졌습니다 …

2개의 좋아요

아니, 이걸로 해결되길 바랐는데 yml 파일에 이미 DISCOURSE_FORCE_HTTPS: true가 설정되어 있네요.

이제 이 사이트 하나만 이런 문제가 생기는 이유에 대해 더 혼란스럽습니다.

관리자 인터페이스에서 “force https” 설정을 변경했는데, 아마도 같은 것일 겁니다

1개의 좋아요

안녕하세요!

저는 Apache 대신 NGINX를 리버스 프록시로 사용하면서 동일한 문제를 겪었습니다.
해결책을 찾으셨나요?

참고로 데스크톱 버전에서만 문제가 발생했고, 모바일 버전에서는 아무 문제가 없었습니다.
리버스 프록시에서 버퍼링을 비활성화하여 우회했습니다.

1개의 좋아요

@pfaffman 저는 3.1.0.beta3에서 3.1.0.beta2로 단순히 다운그레이드했을 뿐인데, 모든 것이 순조롭게 진행되었고 이제 정상적으로 완벽하게 작동합니다.

저는 Discourse에 대해 충분히 경험이 없어서 무엇이 잘못되었는지 확인하거나 버그를 등록할 수 없었습니다. 특히 지원되지 않는 설치 환경인 경우 더욱 그렇습니다.

하지만 도움이 될 수 있는 부분이 있다면 기꺼이 도와드리겠습니다!