사용자들이 Discourse 게시물에 삽입(embed)할 비디오, 오디오 파일 등을 호스팅할 수 있도록, Discourse를 실행하는 Nginx와 함께 Apache 서버를 설정했습니다. Apache 서버는 http의 경우 포트 8008, https의 경우 포트 591(IANA에서 http-alt용으로 예약된 포트)에서 실행됩니다. URL에 포트 번호를 지정하면 브라우저에서 서버의 콘텐츠에 접근할 수 있어 이 부분은 정상적으로 작동합니다. 예를 들어:
https://scanalyst.fourmilab.ch:591/video/f9_from_drone_ship_2022-10-12.mp4
하지만 이 URL을 Discourse 게시물에 삽입(embed)하려고 하면 다음과 같은 오류가 발생합니다:
죄송합니다. 서버 'scanalyst.fourmilab.ch’를 찾을 수 없어 이 웹 페이지의 미리보기 생성에 실패했습니다. 미리보기 대신 게시물에 링크만 표시됩니다.
tcpdump를 실행하여 DNS 트래픽을 모니터링해 보면, 이 URL을 거부할 때 아무것도 전송되지 않는 것을 확인할 수 있습니다. DNS 쿼리를 전혀 수행하지 않고 거부하는 것입니다. URL의 포트 번호를 https의 기본 포트인 443으로 변경하면 DNS 쿼리는 정상적으로 수행되지만, Apache 서버가 해당 포트에서 리스닝하지 않고 Discourse 서버가 해당 URL을 처리할 방법을 모르기 때문에 삽입(embed)은 당연히 실패합니다. Discourse 문서에는 삽입(embed) URL에 포트 번호를 지정할 수 없다는 내용이 언급되어 있지 않습니다.
소스 코드를 살펴보다가 lib/final_destination.rb의 362번째 줄에 있는 validate_uri_format 함수 내에 다음과 같은 테스트 코드를 발견했습니다:
return false if @uri.scheme == 'https' && @uri.port != 443
이 코드는 443이 아닌 포트를 사용하는 https URL을 거부하는 것으로 보입니다. 제가 관찰한 현상을 설명하는 것 같아 이 줄을 주석 처리했지만, Discourse를 재시작한 후에도 전혀 차이가 없었습니다. 게시물이 사이트에 표시될 때 삽입(embed)이 텍스트 링크로 변환된 상태로 나타나며, 이 텍스트 링크를 클릭하면 비디오가 정상적으로 재생되므로, 유일한 문제는 URL을 삽입(embed)으로 인식하지 못하고 인라인 플레이어를 감싸지 못하는 것입니다.
현재 제 질문은 다음과 같습니다:
- Discourse 게시물에 삽입(embed)되는 URL에서 비표준 포트 번호가 작동하도록 의도된 것인가요?
- 그렇다면 이러한 URL이 거부되는 원인은 무엇인가요?
- 작동하게 만드는 방법이 있을까요?
2017년 3월에 이 문제에 대한 논의가 이 두 게시물에서 이루어진 적이 있습니다:
이 게시물들은 문제가 수정되었음을 시사했지만, 현재 2.9.0.beta10에서는 작동하지 않습니다.
이 문제에 대한 통찰과/또는 도움을 주시면 감사하겠습니다.