近期更改是否破坏了子文件夹设置?

如果我的诊断有误,我很抱歉。但最近我在一个之前运行正常的子文件夹配置升级后遇到了一些问题,因此我认为近期某些方面可能存在回归?具体来说,我正在使用 此处 描述的子文件夹方案自行托管 Discourse,该方案此前一直运行良好(据我所知),直到最近才出现问题。

目前,当使用 SSO 登录或在匿名模式之间切换时(也许在其他尚未发现的情况下),我会被重定向到 https://my_machine/discourse_path_stuff,而不是预期的 https://my_machine/forum/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 展示了该问题(不过,一旦我们发现此问题,就立即添加了一条额外的 NGINX 规则,专门将 https://py.mit.edu/login 302 重定向回 https://py.mit.edu/forum/login,这至少作为 SSO 部分的一个变通方案)。

我们使用的是 Discourse SSO 协议,此前运行一直非常顺畅。握手过程似乎仍然正常,只是在最后一步重定向到了错误的位置。不过,SSO 载荷中的 "return_sso_url" 键确实正确地返回到了我们的 SSO 端点(包含 /forum)。

我还尝试过重建,但似乎并未解决问题。

不幸的是,这可能很难调试,因为我不太放心让外部人员访问,毕竟该实例是用于课程的,我不愿与学生数据共享给外部方(即使我个人信任您!)。但如果有帮助的话,我很乐意在另一台我可以为您提供访问权限的服务器上尝试复现此设置……

3 个赞

我还注意到,进入/退出匿名模式的链接在调用端点切换到匿名模式后,使用了 window.location.reload() 来重新加载页面。因此,这次重新加载肯定会看到被重写的 URL(不再包含 /forum),从而导致此问题(不确定 SSO 问题是否也是类似的情况)。

我会查看最近的变更集,看看(我认为)重写了 window.location 的那个功能是否是近期添加的。

另外,Discourse.getURL('/login') 仍然返回正确的结果(包含 /forum)。

1 个赞

浏览器地址栏中的路径在重置时丢失了子文件夹前缀。

示例:
我访问 example.com/forum → 论坛加载后,地址栏显示为 example.com
然后点击“最新”→ 导航至 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 个赞

太好了,谢谢!很高兴知道我没有疯。

不过,在浏览最近的(相关)提交时,我没有看到明显的重写发生点。能否指点一下代码中哪里正在或曾经发生这种情况?(我正在努力熟悉代码库)。

1 个赞

当然可以!只是我不是负责这方面的人。我只是团队里碰巧在本地子文件夹中安装了该项目的“那个人”,但我不是工程师。大卫本周晚些时候开始处理这个问题时,应该能为你指明正确的方向。

6 个赞

几乎可以肯定是 这次更改,它是针对 这个问题 的。我不太确定具体问题是什么,但我会去调查一下 :eyes:

6 个赞

事实证明,这与该提交完全无关。我已经找到了问题的根源,修复方案正在推进中:

12 个赞

出色的侦探工作 :man_detective: @david :clap:

6 个赞

这现在已经合并了——@hartz@bokos,能否确认更新后问题已解决?

5 个赞

经过一番测试,情况确实似乎恢复正常了。谢谢,@david

2 个赞