최근 변경 사항으로 서브폴더 설정이 깨졌나요?

잘못 진단한 것이라면 죄송합니다. 하지만 최근 서브폴더 설정으로 잘 작동하던 환경에서 업그레이드를 진행한 후 몇 가지 문제가 발생했습니다. 그래서 최근 몇 달 사이에 일부 기능에서 회귀(regression)가 있었을 가능성이 있다고 생각합니다. 특히 여기에 설명된 서브폴더 설정을 사용하여 Discourse를 셀프호스팅하고 있는데, 최근까지 잘 작동하고 있었습니다(제가 아는 한).

현재 SSO로 로그인하거나 익명 모드에서 전환할 때(아직 발견하지 못한 다른 상황에서도 마찬가지일 수 있습니다) https://my_machine/forum/discourse_path_stuff로 리다이렉트되는 대신 https://my_machine/discourse_path_stuff로 리다이렉트됩니다. 또한 올바른 엔드포인트인 https://my_machine/forum으로 이동하면 주소창에서 서브폴더가 제거되어 https://my_machine으로 바뀌지만, 대부분의 링크는 올바른 위치로 잘 해석됩니다.

불행히도 문제가 없었을 때 실행 중이던 커밋을 기억하지 못하지만, “2.4.0.beta10” 버전 범위 내였을 것으로 확신합니다. 아마도 지난 약 10일 사이였을 것입니다. 현재는 bd49d4af1a 커밋을 실행 중입니다.

아무런 실수를 하고 있는 것이라면 죄송합니다. 문제 해결을 돕고 싶으니, 어디를 살펴봐야 할지에 대한 제안이 있다면 기꺼이 도움을 드리겠습니다.

1개의 좋아요

사이트 URL을 공유해 주시겠어요? SSO 프로토콜을 사용 중이신가요, 아니면 OAuth2 / omniauth 전략을 사용 중이신가요?

2개의 좋아요

네, https://py.mit.edu/forum 에 있습니다(다만 현재 일반 사용자 열람이 차단되어 있습니다). https://py.mit.edu/forum/login 이 문제를 보여줍니다(이 문제를 발견한 후, https://py.mit.edu/login 을 https://py.mit.edu/forum/login 으로 302 리다이렉트하도록 NGINX 규칙을 별도로 추가했는데, 이는 SSO 부분에 대한 임시 해결책으로 작용하고 있습니다).

저희는 Discourse SSO 프로토콜을 사용 중이며, 이전에는 정상적으로 작동했습니다. 핸드셰이크는 여전히 정상적으로 진행되는 것 같지만, 마지막에 잘못된 위치로 리다이렉트되고 있습니다. SSO 페이로드의 "return_sso_url" 키는 /forum 경로와 함께 SSO 엔드포인트로 올바르게 반환되고 있습니다.

재빌드도 시도해 보았지만 문제가 해결되지 않았습니다.

불행히도 이 인스턴스는 수업용으로 존재하므로 외부인에게 접근 권한을 부여하는 것이 어렵습니다. 학생 데이터를 외부 당사자와 공유하는 것에 대해 편안하지 않기 때문입니다(개인적으로 신뢰한다 해도 마찬가지입니다). 하지만 도움이 된다면, 접근 권한을 부여할 수 있는 다른 서버에서 이 설정을 재현해 보도록 하겠습니다…

3개의 좋아요

또한 익명 모드 진입/탈출 링크가 익명 모드로 전환하기 위해 엔드포인트에 요청을 보낸 후 window.location.reload()를 사용해 페이지를 새로고침하는 것을 확인했습니다. 따라서 해당 새로고침은 재작성된 URL(더 이상 /forum을 포함하지 않는)을 받게 되며, 이로 인해 이 문제가 발생합니다(SSO 문제도 비슷한 상황인지 확실하지는 않습니다).

window.location을 재작성하는 것으로 추정되는 부분이 최근 추가된 것인지 확인해 보려고 최근 변경 사항을 살펴보겠습니다.

그리고 Discourse.getURL('/login')은 여전히 올바른 결과(/forum 포함)를 반환합니다.

1개의 좋아요

브라우저의 주소 표시줄에서 서브폴더 접두사 없이 경로가 초기화됩니다.

예:
example.com/forum을 방문하면 → 포럼이 로드된 후 주소 표시줄에 example.com이 표시됩니다.
그 다음 "Latest"를 클릭하면 → latest로 이동하고 주소 표시줄에 example.com/forum/latest가 표시됩니다.
브라우저에서 새로고침을 누르면 웹사이트가 새로고침되고 주소 표시줄에 example.com/latest가 표시됩니다.
example.com/latest에서 다시 새로고침을 하면 404 오류가 발생합니다(nginx가 /forum만 discourse로 라우팅하기 때문).

브라우저 왼쪽 하단의 링크 미리보기에는 example.com/latest, example.com/new 등으로 표시됩니다. 토픽을 새로고침해도 URL에서 /forum이 제거되지만, 잠시 후 다시 /forum/t/[…]로 돌아옵니다.

이전에는 2.4.0.beta2 버전을 사용했고, 이 문제는 기억나지 않습니다.

3개의 좋아요

이 설치는 Docker를 사용한 서브폴더 지원에 따라 생성된 것인가요? 해당 문서에 대한 링크를 공유해 주실 수 있나요?

7개의 좋아요

네, 저도 새로 설치한 로컬 환경에서 테스트해 봤는데 동일한 문제가 발생했습니다:

app.yml

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"

expose:
 - 80:80

params:
  db_default_text_search_config: "pg_catalog.english"
  version: tests-passed

env:
  LANG: en_US.UTF-8
  UNICORN_WORKERS: 3
  DISCOURSE_RELATIVE_URL_ROOT: /forum
  DISCOURSE_HOSTNAME: localhost
  DISCOURSE_DEVELOPER_EMAILS: yyy

  DISCOURSE_SMTP_ADDRESS: yyy
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: yyy@yyy.yyy
  DISCOURSE_SMTP_PASSWORD: yyy
  DISCOURSE_SMTP_AUTHENTICATION: login

volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
            - git clone https://github.com/discourse/docker_manager.git

run:
    - exec:
        cd: $home
        cmd:
          - mkdir -p public/forum
          - cd public/forum && ln -s ../uploads && ln -s ../backups
    - replace:
       global: true
       filename: /etc/nginx/conf.d/discourse.conf
       from: proxy_pass http://discourse;
       to: |
          rewrite ^/(.*)$ /forum/$1 break;
          proxy_pass http://discourse;
    - replace:
       filename: /etc/nginx/conf.d/discourse.conf
       from: etag off;
       to: |
          etag off;
          location /forum {
             rewrite ^/forum/?(.*)$ /$1;
          }
5개의 좋아요

서브폴더 설치 환경에서 문제를 재현할 수 있습니다. 수정하겠습니다.

6개의 좋아요

좋아요, 감사합니다! 제가 미친 게 아니라는 걸 알아서 다행이에요.

다만, 최근(ish) 커밋을 살펴봐도 이 리라이팅이 일어나는 명확한 지점을 찾지 못했습니다. 코드에서 이 리라이팅이 일어나는(있었던) 위치를 알려주시면 가능할까요? (현재 코드베이스에 익숙해지는 과정을 거치고 있습니다).

1개의 좋아요

가능합니다! 다만 저는 해당 분야 전문가가 아닙니다. 저는 우연히 로컬에 서브폴더 설치 환경을 가지고 있을 뿐, 엔지니어가 아닙니다. 데이비드가 이번 주 후반에 이 문제를 다루기 시작하면 올바른 방향으로 안내해 줄 수 있을 겁니다.

6개의 좋아요

거의 확실하게 이 변경 사항일 것입니다. 이 변경은 이 이슈를 위해 이루어진 것입니다. 정확히 어떤 문제인지 확실하지는 않지만, 조사해 보겠습니다 :eyes:

6개의 좋아요

결국 그 커밋과는 전혀 무관한 문제였습니다. 문제의 원인을 찾았고, 수정이 진행 중입니다:

12개의 좋아요

훌륭한 탐정 :man_detective: 활약이었네요 @david :clap:

6개의 좋아요

이제 병합되었습니다. @hartz님과 @bokos님, 업데이트 후 문제가 해결되었는지 확인해 주시겠어요?

5개의 좋아요

조금 테스트해 본 결과, 실제로 다시 정상 작동하는 것 같습니다. @david 님, 감사합니다!

2개의 좋아요