그 후로 저는 Discourse 인스턴스를 다른 서버로 이전했고, 현재는 SSL 종결이 이루어지는 리버스 프록시 뒤에서 실행되고 있습니다.
그러나 헤더 이미지와 파비콘이 HTTPS로 요청되지 않아 차단되고 있습니다. "force https"를 켜서 설정해 보았지만 문제가 해결되지 않았습니다.
![]()
그 후로 저는 Discourse 인스턴스를 다른 서버로 이전했고, 현재는 SSL 종결이 이루어지는 리버스 프록시 뒤에서 실행되고 있습니다.
그러나 헤더 이미지와 파비콘이 HTTPS로 요청되지 않아 차단되고 있습니다. "force https"를 켜서 설정해 보았지만 문제가 해결되지 않았습니다.
![]()
프록시가 X-Forwarded-Proto 헤더를 제공하고 있나요? (제공해야 합니다.)
프록시가
X-Forwarded-Proto헤더를 제공하고 있나요? (제공해야 합니다.)
네, 제공하고 있습니다.
저도 동일한 문제를 겪었습니다. HAProxy 뒤에서 SSL 터미네이션을 사용하는 Discourse 인스턴스를 운영하고 있습니다. 해결 방법은 꽤 간단하지만, 직관적이지는 않습니다:
(이것은 Discourse의 버그일 수 있다고 생각합니다)
안녕하세요,
이 문제에 대해 다시 말씀드리고자 합니다. 사실 저 역시 동일한 문제를 겪고 있으며, 로그인할 수 있는 방법이 없어서 force_https를 true로 설정할 수 없습니다… (로그인 시 알 수 없는 오류가 발생합니다).
로고가 http가 아닌 https 요청으로 참조되도록 강제하는 방법은 무엇인가요?
이것이 그렇게 어려운 일이 아니어야 하지 않나요?
피드백 주시면 정말 감사하겠습니다. (이 문제를 해결하는 데 제 쪽에서 정말 많은 시간을 보냈습니다).
SSH로 서버에 접속하여 Ruby 명령줄을 실행한 후 force_https 사이트 설정을 변경해야 합니다. 이를 수행하는 방법에 대한 howto 주제가 여기에 있습니다.
답변 주셔서 감사합니다. 제 메시지가 분명하지 않았던 것 같습니다. 실제로는 rails 명령어로 force_https를 변경할 수 있으니 문제없습니다. 좀 더 명확히 말씀드리자면:
며칠 전에 수행한 마지막 업그레이드(이때 docker 컨테이너를 재빌드해야 했습니다) 이전까지는 force_https를 true로 설정하고 nginx 설정 파일의 server 섹션에 아래 패치를 적용하면 정상적으로 로그인할 수 있었습니다:
if ($http_x_forwarded_proto = 'http'){
return 301 https://$host$request_uri;
}
그리고 잘 작동했습니다. 그러나 업그레이드 이후에는 동일한 패치를 적용해도 다시 로그인할 수 없게 되었고, 잘 알려진 "Unknown error"가 발생했습니다.
production 로그에서 다음과 같은 트레이스를 확인했습니다:
Started POST "/session" for 193.134.222.4 at 2020-05-14 19:24:40 +0000
Processing by SessionController#create as */*
Parameters: {"login"=>"rossierd", "password"=>"[FILTERED]", "second_factor_method"=>"1", "timezone"=>"Europe/Zurich"}
Can't verify CSRF token authenticity.
Rendering text template
Rendered text template (Duration: 0.0ms | Allocations: 1)
Filter chain halted as :verify_authenticity_token rendered or redirected
Completed 403 Forbidden in 2ms (Views: 0.7ms | ActiveRecord: 0.0ms | Allocations: 1101)
참고로, 저희 discourse 컨테이너는 https로 접근 가능한 VM에서 실행되고 있습니다.
업그레이드 전후로 이러한 동작 변화가 발생한 원인에 대해 혹시 추측하시는 바가 있으신가요?
현재까지는 force_https를 false로 비활성화했는데, 왼쪽 상단의 로고(브랜드 로고)가 http:// 요청으로 참조되고 있어 제대로 표시되지 않는 것을 제외하면 모든 것이 잘 작동합니다.
참고로 저희 사이트의 URL은 다음과 같습니다: https://discourse.heig-vd.ch
또한, 문제 있는 URL이 포함된 다음 사이트 설정도 발견했습니다:
SiteSetting.site_favicon_url (또 다른 하나는 SiteSetting.site_apple_touch_icon)이며 값이 "http://…jpeg"입니다.
그러나 force_https와 같이 간단한 레일 명령어로 값을 변경하는 것이 명백하지 않아 보입니다…
이 주제에 대해 도움이 필요합니다. 어떤 도움이라도 주실 수 있나요?
이 설정은 설정 마법사를 통해 수행합니다. 설정 마법사를 다시 실행하고 이미지를 다시 업로드하세요.
이미지를 그렇게 설정했습니다. 마법사를 다시 실행해 봤지만, 결국 같은 결과가 나왔습니다. ![]()
사진을 업로드하는 방식이 이미지 참조 방식에 영향을 주지는 않는 것 같습니다. 웹 페이지 생성과 관련된 문제인 것 같네요.
글쎄, 여러 번 실패한 끝에 마침내 force_https=true로 유효한 로그인을 하는 방법을 찾았습니다.
Docker 환경에서 /etc/nginx/conf.d/discourse.conf 파일을 다음과 같이 패치했습니다:
…
location @discourse {
limit_conn connperip 20;
limit_req zone=flood burst=12 nodelay;
limit_req zone=bot burst=100 nodelay;
proxy_set_header Host $http_host;
proxy_set_header X-Request-Start “t=${msec}”;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https; # $thescheme; ← 제가 수정한 부분
proxy_pass http://discourse;
}
…
그리고 제 환경에서는 이 섹션에서만 작동합니다.
이제 완벽하게 작동합니다!