발신 부분 링크를 https로 자동 변환(실시간)? - http는 제외

백엔드에서 게시물 내의 부분 링크(예: example.com)를 모두 https 링크(예: https://www.example.com)로 변환할 수 있는 방법이 있을까요?

현재 http:// 링크로 변환되는 것으로 보이며, 이는 게시물에서 해당 링크를 클릭하는 많은 사용자에게 http://example.com으로의 출력이 실패하여 다양한 문제를 일으키고 있습니다.

(또는 생성된 대상 주소를 확인하여 해당 주소로 접근할 수 있는 올바른 프로토콜로 수정하는 방법은 없을까요?)

감사합니다. 첫 질문입니다. 중복된 질문일 수 있어 죄송하지만, 이 내용을 간결하게 설명하는 것을 찾지 못했습니다.
mitch

이제 기본적으로 링크를 https로 설정할 때가 된 것 같습니다. 이는 기능 요청 사항일 수 있습니다.

제발 안 됐으면 합니다. SSL이 필요 없어서 HTTP를 사용하는 사이트가 밖에는 정말 많거든요.

이것도 검색 및 치환으로 해결되는 가벼운 작업인가요? 아니면 제가 또 다시 오해하고 있는 건가요?

비합리적인 패닉 발작

게다가 Discourse가 자체 VPS를 사용하고, 그 앞에 리버스 프록시가 있는 또 다른 VPS가 있는 경계 상황도 신경이 쓰입니다. 이런 경우 두 서버는 SSL 없이 서로 통신하는 경우가 꽤 많거든요.

하지만 이건 완전히 다른 상황인 거죠? 그런데 제가 익숙한 약어에 대해 기본값이 바뀔 수 있는 상황이 생길 때마다 조금씩 예민해지기 시작하네요…

해당 사이트들이 HTTPS가 필요 없다는 당신의 의견에 동의하지 않습니다. 현재 시점에서 사이트를 보안으로 보호하지 않을 명분은 없습니다.

하지만 이 문제가 기능 요청 사항이어야 한다는 제 생각은 틀린 것 같습니다. HTTPS로 강제 전환을 처리해야 할 주체는 Discourse가 아니라 브라우저입니다.

모던 브라우저가 기본적으로 HTTPS를 HTTP보다 우선시한다고 확신합니다.
또한 많은 웹사이트가 서버 측에서 HTTPS로 리다이렉트하거나 HSTS 헤더를 사용합니다.

현실을 논하는 상황에서 제가 틀렸다고 생각하지 않습니다.

보안이 필요한 데이터가 전혀 포함되지 않은 경우 서버 간 연결을 SSL로 보호할 필요성은 별도의 주제에서 다룰 가치가 있습니다. 하지만 여기서는 완전히 주제에서 벗어난 이야기입니다.

사용자에게 "죄송합니다. 제3자가 포트 443을 사용하지 않아 링크를 만들 수 없습니다"라고 말하는 것은 정말 나쁜 아이디어입니다. 사용자가 무엇을 해야 하거나 반드시 해야 하는지를 결정하는 것은 관리자의 역할도, 더 나아가 Discourse의 역할도 아닙니다.

HTTPS가 존재한다면 그렇습니다. 그리고 일부 가정용 라우터/모뎀은 https만 사용하도록 설정되어 있는데, 이는 실제로 매우 성가신 문제입니다. 왜냐하면 모든 사이트가 Google의 모든 곳에 SSL을 사용하라는 요구를 따르는 것이 아니기 때문입니다. 또한 많은 플랫폼이 http를 사용하여 오래된 링크를 제공하고 있어, 그 바보스러운 기기들이 URL을 다시 작성(rewrite)할 수 없기 때문입니다.

따라서 어떤 기능 논의에 앞서 먼저 메타 토픽이 있어야 합니다: 포럼 플랫폼이 외부 링크에 대해 SSL 사용을 강제할 책임이 있는가 하는 것입니다.

그 후 기술적 해결책은 비교적 쉽다고 생각합니다 — 하지만 다시 말하지만, 저는 개발자가 아닙니다.

다시 본론으로 돌아가겠습니다.

즉, 검색 및 치환(search&replace)이 즉각적인 해결책이 아닌가? 하지만 지금 제가 이해를 못 하고 있습니다… 다시… 진짜 문제는 단순히 URL만 입력했을 때 Discourse가 링크를 자동으로 형성하는 방식인가? 만약 그렇다면, 저는 한 발 물러서서 동의합니다. 자동으로 https가 적용되어야 합니다 — 하지만 수정 가능해야 합니다.

대상 페이지의 head만 사용하여 http(및 유사한 기능의 https)가 가능한지 확인하는 코드입니다. 아래 주소에서 복사했습니다:
https://stackoverflow.com/questions/65955022/python-check-if-webpage-is-http-or-https

def check_http_url(url):
    HTTP_URL = f'http://{url}'
    try:
        HTTP_URL = urlparse(HTTP_URL)
        connection = HTTPConnection(HTTP_URL.netloc)
        connection.request('HEAD', HTTP_URL.path)
        if connection.getresponse():
            return True
        else:
            return False
    except:
        return False

즉, 이 코드를(기억이 맞다면) Ruby로 변환하여 Discourse 백엔드가 게시글에 주어진 부분 링크의 대상이 https인지 http인지를 파악한 다음, (https를 우선하여) 사용자에게 올바른 대상 링크를 열 수 있을까요?