# 서브폴더에서 사이트 상대 경로가 클라이언트 측에서 잘못 재작성됩니다

**URL:** https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947
**Category:** Bug
**Tags:** subfolder
**Created:** [6월 7, 2021, 5:25오전 UTC](https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947 "2021-06-07T05:25:50Z")
**Posts on this page:** 17
**Page:** 1

<div class="post-metadata">

### Author: ![vincentp](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/vincentp/32/110063_2.png) [@vincentp](https://meta.discourse.org/u/vincentp)
#### Post date: [6월 7, 2021, 5:25오전 UTC](https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947/1 "2021-06-07T05:25:50Z")

</div>

이전에는 정상적으로 작동했지만, 최근 업데이트 이후 다시 문제가 발생한 것 같습니다.

상대 경로 링크 추가

```markdown
[Full version 1.9.2 change history](/downloads/continuaci/continua-ci-version-history-v192)

```

를 추가하면 링크는 올바르게 렌더링되고 마크업도 정확하지만, 링크를 클릭하면 다음과 같이 변환됩니다.

[https://www.finalbuilder.com/forums/downloads/continuaci/continua-ci-version-history-v192](https://www.finalbuilder.com/forums/downloads/continuaci/continua-ci-version-history-v192)

참고로, 저희 discourse 인스턴스는 **forums** 하위 폴더에 설치되어 있습니다.

올해早些时候 이 영역에서 일부 변경 사항이 있었던 것으로 보이며, 이것이 관련이 있을 수 있습니다.

> <https://github.com/discourse/discourse/pull/12135>

현재 2.8 beta1 버전을 사용 중입니다 - [Commits · discourse/discourse · GitHub](https://github.com/discourse/discourse/commits/28e201f3919e23d734a5414f18dbf83d1d52a5e0)

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [6월 7, 2021, 6:54오전 UTC](https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947/2 "2021-06-07T06:54:53Z")

</div>

상대 링크는 서브폴더 루트를 기준으로 해석된다고 보는 것이 타당하다고 생각합니다. 따라서 포럼 외부로 연결되는 링크를 사용하려면 완전한 URL(절대 경로)을 사용해야 합니다.

대안으로, 영구 링크 라우팅을 `/forum/downloads/*`에서 `https://example.com/downloads/*`로 설정할 수 있을 것 같습니다.

---

<div class="post-metadata">

### Author: ![vincentp](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/vincentp/32/110063_2.png) [@vincentp](https://meta.discourse.org/u/vincentp)
#### Post date: [6월 7, 2021, 6:57오전 UTC](https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947/3 "2021-06-07T06:57:55Z")

</div>

이전에는 작동했는데 왜 변경된 건가요?

상대 경로가 앵커(absolute path)로 지정된 경우, 예를 들어 `/downloads`라면, HTML/HTTP 환경에서는 사이트의 루트(root)를 의미하는 것이 일반적이지 서브폴더의 루트를 의미하는 것은 아니라고 생각됩니다.

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [6월 7, 2021, 7:41오전 UTC](https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947/4 "2021-06-07T07:41:57Z")

</div>

즉, 메인 웹사이트에 `/t/something`으로 시작하는 링크가 있다면, 그것이 Discourse 링크인지 메인 웹사이트 링크인지 어떻게 구별할 수 있을까요?

---

<div class="post-metadata">

### Author: ![Dave\_Sparks](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dave_sparks/32/125614_2.png) [@Dave\_Sparks](https://meta.discourse.org/u/Dave_Sparks)
#### Post date: [6월 7, 2021, 7:53오전 UTC](https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947/5 "2021-06-07T07:53:16Z")

</div>

이것은 `/forums/t/something`으로 작성됩니다. 이는 포럼 게시글을 작성하는 일반 사용자가 기대하는 형태입니다. 대부분의 웹사이트가 이렇게 작동하므로, 누가 `/t/something`을 입력해야 하는지 알겠습니까?

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [6월 7, 2021, 1:57오후 UTC](https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947/6 "2021-06-07T13:57:50Z")

</div>

> [@RGJ](#):
>
> 상대 링크는 서브폴더 루드를 기준으로 한다고 보는 것이 타당하다고 생각합니다. 따라서 포럼 외부로 링크를 걸려면 전체 URL을 사용해야 합니다.

여기서는 @RGJ님의 의견에 동의합니다. 여러 애플리케이션이 동일한 서브폴더 접두어를 공유하는 것은 문제를 초래하기 쉽습니다.

저에게는 "수정 불가"입니다.

---

<div class="post-metadata">

### Author: ![vincentp](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/vincentp/32/110063_2.png) [@vincentp](https://meta.discourse.org/u/vincentp)
#### Post date: [6월 7, 2021, 10:57오후 UTC](https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947/7 "2021-06-07T22:57:23Z")

</div>

진짜요? /로 시작하는 URL을 작성하면 **설계상**  **사이트** 의 루트에 위치하게 됩니다 - HTML 링크가 작동하는 방식을 재정의하시는 건가요?

이것은 최근의 호환성 깨짐(breaking change)이 발생하기 전까지 우리 사이트에서 2년 반 동안 정상적으로 작동했습니다.

---

<div class="post-metadata">

### Author: ![Dave\_Sparks](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dave_sparks/32/125614_2.png) [@Dave\_Sparks](https://meta.discourse.org/u/Dave_Sparks)
#### Post date: [6월 7, 2021, 11:20오후 UTC](https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947/8 "2021-06-07T23:20:59Z")

</div>

> [@Falco](#):
>
> 여러 애플리케이션 간에 동일한 서브폴더 접두사를 공유하는 것은 문제를 초래하기 위한 것입니다.

바로 그 점이 문제입니다. Discourse가 여러 애플리케이션에 동일한 접두사 `/forums`를 추가하고 있으며, 이로 인해 aforementioned(앞서 언급된) 문제가 발생하고 있습니다. 게시물에 입력된 URL을 왜 변경해야 하는지 이해가 되지 않습니다.

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [6월 9, 2021, 2:02오전 UTC](https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947/12 "2021-06-09T02:02:06Z")

</div>

현재 이 문제를 조사 중이며, 다음과 같은 수정 사항과 관련이 있을 수 있습니다:

> [@서브폴더 설정에서 클라이언트 사이드 경로 재작성 실패](https://meta.discourse.org/t/client-side-path-rewrite-failing-with-subfolder-setup/179504/1):
>
> Continuing the discussion from [Discourse rewriting url path behaviour failing due to subfolder](https://meta.discourse.org/t/discourse-rewriting-url-path-behaviour-failing-due-to-subfolder/94120/12): I have the exact same issue from the aforementioned topic, in which the URL is rewritten only in scenarios where the start of a sub-route is equal to the subfolder. I’m using /f as subfolder, I understand the caveats and pains of this setup, but everything else is working fine so I’d like to get some help fixing this, if possible. I’m not using an existing Discourse route, but if the one-letter sub…

서브폴더 설정과 무관하게 `acme.com`의 `/jobs` 링크는 `acme.com/jobs`로 이동해야 한다는 점에 동의합니다. `acme.com/forum/jobs`로 이동해서는 안 됩니다.

---

<div class="post-metadata">

### Author: ![renato](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/renato/32/383632_2.png) [@renato](https://meta.discourse.org/u/renato)
#### Post date: [6월 9, 2021, 6:46오후 UTC](https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947/14 "2021-06-09T18:46:33Z")

</div>

링크된 커밋보다 약간 늦은 시점에 [get-url.js](https://github.com/discourse/discourse/blob/9f474b1c1c99c96f6b613a75854fe6cf9067e2d4/app/assets/javascripts/discourse-common/addon/lib/get-url.js)에 마지막 커밋을 추가했습니다.

사용자가 직접 입력한 링크는 재작성되지 않아야 한다는 데 동의합니다. 이러한 시나리오에서는 `getURL`을 호출하지 않는 것이 맞을까요? `getURL`은 Discourse 기본 라우트를 서브폴더 설정으로 "변환"하는 용도로 사용되어야 한다고 생각합니다. 실제로 서브폴더 접두사 추가를 명시적으로 기대하는 테스트가 있습니다:

> <https://github.com/discourse/discourse/blob/fc61a7c0ded02665502f879e1581109789b61048/app/assets/javascripts/discourse/tests/unit/lib/get-url-test.js#L98-L103>

도움이 필요하시면 말씀해 주세요.

---

<div class="post-metadata">

### Author: ![eviltrout](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/eviltrout/32/5275_2.png) [@eviltrout](https://meta.discourse.org/u/eviltrout)
#### Post date: [6월 9, 2021, 8:17오후 UTC](https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947/15 "2021-06-09T20:17:29Z")

</div>

오늘 오후에 이 문제를 조사했고, 해당 PR에 수정 사항을 반영했습니다:

> <https://github.com/discourse/discourse/pull/13349>
>
> Before this fix if your forum was set up with a subfolder and you
> clicked on a …link to a different subfolder it would not work. For
> example:
> 
> subfolder: /cool
> link is: /about-us
> 
> Previously it would try to resolve /about-us as /cool/about-us. With
> this fix it redirects to /about-us correctly.

불행히도 우리의 `routeTo` 코드는 상대 URL과 함께 작동하도록 설계되어 있습니다. 따라서 `url.routeTo("/cool")`를 호출하고 `sub`라는 서브폴더가 설정된 경우, `/cool`이 상대적으로 보임에도 불구하고 `/sub/cool`로 재작성됩니다. 이것이 올바른 동작이라고 생각하지는 않지만, 많은 코드가 이 동작에 의존하고 있을 것 같습니다.

다행히 이번 경우에는 클릭 트래커가 해당 URL을 내부 URL로 오인하여 리다이렉트를 수행하고 있었습니다. 내부 링크가 동일한 접두사를 사용하는지 확인하는 검사를 추가하고 테스트를 정리했습니다. 정상적으로 작동하는 것 같습니다.

하지만 어떻게 회귀(regression)가 발생했는지는 전혀 알 수 없습니다 - git blame을 시도해 보았지만 아무것도 나오지 않았습니다.

---

<div class="post-metadata">

### Author: ![vincentp](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/vincentp/32/110063_2.png) [@vincentp](https://meta.discourse.org/u/vincentp)
#### Post date: [6월 16, 2021, 6:34오전 UTC](https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947/19 "2021-06-16T06:34:12Z")

</div>

이것이 관련이 있는지 확실하지는 않지만, 업데이트를 적용한 후 링크 편집기가 더 이상 작동하지 않습니다(빈 상태로 표시되거나 필드가 분리되지 않음).

---

<div class="post-metadata">

### Author: ![vincentp](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/vincentp/32/110063_2.png) [@vincentp](https://meta.discourse.org/u/vincentp)
#### Post date: [6월 16, 2021, 6:41오전 UTC](https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947/20 "2021-06-16T06:41:03Z")

</div>

이것은 더 나빠진 것 같습니다.

링크를 추가하면  
`[forum relative link](/forums/t/continua-ci-v1-9-2-664-released/7058)`

다음과 같이 처리됩니다.  
`[forum relative link](https:///forums/t/continua-ci-v1-9-2-664-released/7058)`

이 경우 href 속성 없이 렌더링됩니다.

---

<div class="post-metadata">

### Author: ![vincentp](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/vincentp/32/110063_2.png) [@vincentp](https://meta.discourse.org/u/vincentp)
#### Post date: [6월 16, 2021, 6:44오전 UTC](https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947/21 "2021-06-16T06:44:57Z")

</div>

참고로 위의 테스트는 [Commits · discourse/discourse · GitHub](https://github.com/discourse/discourse/commits/03fc31e23bf7f7ed78488e700680c4388a7a319e) 에서 수행되었습니다.

---

<div class="post-metadata">

### Author: ![Dave\_Sparks](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dave_sparks/32/125614_2.png) [@Dave\_Sparks](https://meta.discourse.org/u/Dave_Sparks)
#### Post date: [6월 16, 2021, 7:07오전 UTC](https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947/22 "2021-06-16T07:07:05Z")

</div>

또한, /downloads와 같은 같은 사이트 내 상대 링크가 외부 링크로 처리되어 새 브라우저 탭에서 열립니다. 이는 큰 문제가 아닙니다.

또한, 큰 문제는 아니지만, 제가 그랬듯이 포럼 게시물 링크 끝에 있는 게시물 ID를 제거하면, 예를 들어 [이 링크](https://meta.discourse.org/t/client-side-path-rewrite-failing-with-subfolder-setup/)를 클릭할 때 브라우저 히스토리가 사라집니다.

---

<div class="post-metadata">

### Author: ![eviltrout](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/eviltrout/32/5275_2.png) [@eviltrout](https://meta.discourse.org/u/eviltrout)
#### Post date: [6월 16, 2021, 3:13오후 UTC](https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947/23 "2021-06-16T15:13:48Z")

</div>

> [@vincentp](#):
>
> 그렇게 되면 결국  
> `[forum relative link](https:///forums/t/continua-ci-v1-9-2-664-released/7058)`  
> 이 됩니다.

불행히도 이 문제를 재현할 수 없습니다. 로컬에서 동일한 링크를 사용하면 올바르게 처리됩니다. 또한 제 패치는 링크가 HTML로 작성되는 방식을 변경하지 않으며, 링크를 클릭했을 때 발생하는 동작만 처리합니다.

> [@Dave\_Sparks](#):
>
> 또한 큰 문제는 아니지만, 포럼 게시물 링크 끝부분의 게시물 ID를 제가 그랬듯이 제거하면, 예를 들어 [이 링크](https://meta.discourse.org/t/client-side-path-rewrite-failing-with-subfolder-setup/)와 같이 링크를 클릭할 때 브라우저 히스토리가 사라집니다.

이미 이 문제를 검토하고 있다고 생각합니다. 감사합니다:

> <https://github.com/discourse/discourse/pull/13367#pullrequestreview-682736698>
>
> Clicking on an incomplete link to a topic (/t/ID or /t/SLUG) from
> another post …could replace current history entry or create two: one for
> the incomplete URL and another one for the correct one. Going back was
> either impossible or took the user to a redirect loop, redirected back
> to /t/ID which redirected them again to /t/SLUG/ID.

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [7월 27, 2021, 6:47오전 UTC](https://meta.discourse.org/t/site-relative-paths-rewritten-client-side-incorrectly-with-subfolder/192947/24 "2021-07-27T06:47:37Z")

</div>


