proxies/forge: fix attachment proxying for images

This turned out to be a bit complicated, see
https://codeberg.org/forgejo/forgejo/issues/6360#issuecomment-9010932 . Pagure
images in comments use root-relative Markdown links, like this:

![image.png](/group/repo/issue/raw/files/image.png)

but Forgejo renders those relative to *the repo*, not the server root, so
they get rendered as something like:

<img src="/forgejoorg/forgejorepo/group/repo/issue/raw/files/image.png">

However, it does *not* do this for *non-image* root-relative links, so those
aren't 'broken'. This means we need to handle *both* cases in the proxying,
and we also need to keep in mind that Pagure allows repos without a group.
So we can wind up with one, two, three or four folders before /issue.

I did some testing and I *think* this should cover all cases. I've tested
this does fix images, I haven't tested on a non-image attachment yet (need
to find one).

Signed-off-by: Adam Williamson <awilliam@redhat.com>
This commit is contained in:
Adam Williamson
2025-12-17 16:46:43 -08:00
committed by adamwill
parent 219ffbf416
commit cacc7710ad

View File

@@ -7,6 +7,20 @@ SSLProxyVerify require
SSLProxyVerifyDepth 2
SSLProxyCACertificateFile "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem"
</Proxy>
# Forgejo can't decide whether to render root-relative links as relative
# to the server root or the repo root, and currently behaves differently
# for image and non-image links:
# https://codeberg.org/forgejo/forgejo/issues/6360#issuecomment-9010932
# This first match handles cases where the link is rendered relative to
# to repo. As all repos must have an org in Forgejo, if there are more
# than two directories before /issue, this must be repo-relative; the
# third match will be either pagurerepo or pagureorg/pagurerepo
ProxyPassMatch ^/(.+?)/(.+?)/(.+?)/issue/raw/files/(.*)$ https://pagure.io/$3/issue/raw/files/$4
# This match handles cases where the link is rendered relative to the
# server root; if we didn't hit the first match, the first match here
# will be pagurerepo or pagureorg/pagurerepo
ProxyPassMatch ^/(.+?)/issue/raw/files/(.*)$ https://stg.pagure.io/$1/issue/raw/files/$2
{% endif %}