diff --git a/lib/manager/composer/__fixtures__/composer4.json b/lib/manager/composer/__fixtures__/composer4.json
index 89e3d1dd42d7b84129aff0ebbe459ccd728049f6..2a1f21d3ec84dbb02fd536488433916dec63bbf3 100644
--- a/lib/manager/composer/__fixtures__/composer4.json
+++ b/lib/manager/composer/__fixtures__/composer4.json
@@ -15,6 +15,10 @@
     {
       "type": "composer",
       "url": "https://wpackagist.org"
+    },
+    {
+      "type": "composer",
+      "url": "https://gitlab.vendor.com/api/v4/group/2/-/packages/composer/packages.json"
     }
   ],
   "require": {
diff --git a/lib/manager/composer/__snapshots__/extract.spec.ts.snap b/lib/manager/composer/__snapshots__/extract.spec.ts.snap
index d29731eb95a26ebfa13b819da4ba757770f3801b..e51fb13efe2cbf80b626641461e517995ff77102 100644
--- a/lib/manager/composer/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/composer/__snapshots__/extract.spec.ts.snap
@@ -600,6 +600,7 @@ Object {
   ],
   "registryUrls": Array [
     "https://wpackagist.org",
+    "https://gitlab.vendor.com/api/v4/group/2/-/packages/composer",
     "https://packagist.org",
   ],
 }
diff --git a/lib/manager/composer/extract.spec.ts b/lib/manager/composer/extract.spec.ts
index 17a4f4807118e4287f78329ca7d47c14480bf09d..ff3fe792f1184392d7d1276015d0540bf3b7e56a 100644
--- a/lib/manager/composer/extract.spec.ts
+++ b/lib/manager/composer/extract.spec.ts
@@ -58,7 +58,7 @@ describe('lib/manager/composer/extract', () => {
     it('extracts repositories and registryUrls', async () => {
       const res = await extractPackageFile(requirements4, packageFile);
       expect(res).toMatchSnapshot();
-      expect(res.registryUrls).toHaveLength(2);
+      expect(res.registryUrls).toHaveLength(3);
     });
     it('extracts object repositories and registryUrls with lock file', async () => {
       fs.readLocalFile.mockResolvedValue(requirements5Lock);
diff --git a/lib/manager/composer/extract.ts b/lib/manager/composer/extract.ts
index 1a53277532d68dca7f0bc338726436046217aa06..28d64d14f4c8532d8e7dcdbeef24ddd9c1bfac97 100644
--- a/lib/manager/composer/extract.ts
+++ b/lib/manager/composer/extract.ts
@@ -29,6 +29,17 @@ interface ComposerConfig {
   'require-dev': Record<string, string>;
 }
 
+/**
+ * The regUrl is expected to be a base URL. GitLab composer repository installation guide specifies
+ * to use a base URL containing packages.json. Composer still works in this scenario by determining
+ * whether to add / remove packages.json from the URL.
+ *
+ * See https://github.com/composer/composer/blob/750a92b4b7aecda0e5b2f9b963f1cb1421900675/src/Composer/Repository/ComposerRepository.php#L815
+ */
+function transformRegUrl(url: string): string {
+  return url.replace(/(\/packages\.json)$/, '');
+}
+
 /**
  * Parse the repositories field from a composer.json
  *
@@ -53,7 +64,7 @@ function parseRepositories(
             repositories[name] = repo;
             break;
           case 'composer':
-            registryUrls.push(repo.url);
+            registryUrls.push(transformRegUrl(repo.url));
             break;
           case 'package':
             logger.debug(