欢迎随时访问 https://sales-community-staging.rainmakers.co/sales-community/ 查看该问题。不过无法保证该链接会一直有效。
我认为这是因为 URL 中没有添加 /sales-community 路径。
如果需要,我可以提供 app.yml 或 nginx.conf 文件,请告知。
当前使用的是 version: tests-passed。
尝试过切换到 version: stable 来解决,但目前在 Docker 中无法编译(之前在某个其他问题报告中提到过。我是全新安装,并非降级)。
有人能帮我开启一次发布多张图片的权限吗?
1 个赞
是的。其他所有功能都正常(发帖、邮件、头像上传、HTTPS 等)。所有其他资源都有正确的 /sales-community 子文件夹 URL(如图所示)。只有 SVG 文件损坏。
# app.yml
stuff...
DISCOURSE_HOSTNAME: sales-community.rainmakers.co
DISCOURSE_RELATIVE_URL_ROOT: /sales-community
stuff...
run:
- exec:
cd: $home
cmd:
- mkdir -p public/sales-community
- cd public/sales-community && ln -s ../uploads && ln -s ../backups
- replace:
global: true
filename: /etc/nginx/conf.d/discourse.conf
from: proxy_pass http://discourse;
to: |
rewrite ^/(.*)$ /sales-community/$1 break;
proxy_pass http://discourse;
- replace:
filename: /etc/nginx/conf.d/discourse.conf
from: etag off;
to: |
etag off;
location /sales-community {
rewrite ^/sales-community/?(.*)$ /$1;
}
- replace:
filename: /etc/nginx/conf.d/discourse.conf
from: $proxy_add_x_forwarded_for
to: $http_your_original_ip_header
global: true
RGJ
(Richard - Communiteq)
4
是的,问题不在 CSP,因为 URL 本身是错误的——它似乎没有添加子文件夹路径前缀。我认为需要在这里添加。
4 个赞
嗯,这是子文件夹的 bug 吗 @eviltrout?
david
(David Taylor)
9
我们确实已经为子文件夹场景中的 SVG 精灵图准备了所有逻辑,并且已有多个站点成功应用。但在这种情况下,我们遇到了一个非常特定的边缘情况。检查 @vkozyrev 站点(在浏览器控制台中)的关键变量:
> Discourse.SvgSpritePath
"/svg-sprite/sales-community-staging.rainmakers.co/svg-2-8ed106e6e3d908b1b86898dfe93a7bac0fd358f4.js"
> Discourse.BaseUri
"/sales-community"
看起来没问题。接下来,当我们加载 SVG 精灵图时,会使用 loadScript,它会调用 Discourse.getURL。该函数负责添加子文件夹前缀。尝试一下:
> Discourse.getURL(Discourse.SvgSpritePath)
"/svg-sprite/sales-community-staging.rainmakers.co/svg-2-8ed106e6e3d908b1b86898dfe93a7bac0fd358f4.js"
咦……这似乎没有产生任何效果。而另一个随机 URL 则正常工作:
> Discourse.getURL("/blah")
"/sales-community/blah"
进一步深入调查后,发现了 getUrl 函数中的 这一行代码:
if (url.indexOf(Discourse.BaseUri) !== -1) return url;
用中文来说就是:“如果 URL 已经包含子文件夹前缀,就放弃处理。”因此,这里的问题是 @vkozyrev 的子文件夹前缀(/sales-community)被包含在了 SVG 精灵图 URL 的中间部分:
/svg-sprite/sales-community-staging.rainmakers.co/svg-2-8ed106e6e3d908b1b86898dfe93a7bac0fd358f4.js
我已经让该检查更加具体,现在它只检查子文件夹前缀是否出现在 URL 的开头:
不过,这也让我想到其他潜在的问题……例如,如果有人希望将子文件夹前缀设置为 /t 或 /about,或者是我们在 Discourse 中使用的任何其他 URL:thinking:
10 个赞
david
(David Taylor)
10
@vkozyrev 已合并,请更新您的网站,并告知我们是否解决了问题 
问题已修复,@david。
这是一个令人惊叹的边界情况
。我只做 Rails(仅 API 模式)开发,很高兴没有深入那个兔子洞,否则我会在客户端代码里迷失方向。
如果您好奇的话,我在前面设置了一个代理,因此 sales-community 子域名对用户是隐藏的,他们只会看到主站 URL 前面的 /sales-community。主站托管在 Heroku 上,所以我无法使用单个 nginx 实例来统一路由。
感谢大家的快速回复和修复!
6 个赞