diff --git a/lib/datasource/helm/__snapshots__/index.spec.ts.snap b/lib/datasource/helm/__snapshots__/index.spec.ts.snap
index 11e2ce569c934ea90c91b4584870e3dcbeae0491..ce20b09edf64d758dbd1473a08326451ee01e3ae 100644
--- a/lib/datasource/helm/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/helm/__snapshots__/index.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`datasource/helm getReleases returns list of versions for normal response if index.yaml is not cached 1`] = `
+exports[`datasource/helm getReleases returns list of versions for normal response 1`] = `
 Object {
   "homepage": "https://www.getambassador.io/",
   "name": "ambassador",
diff --git a/lib/datasource/helm/index.spec.ts b/lib/datasource/helm/index.spec.ts
index e4161036797aa7e42d2d4454888d5875bc4dc6eb..b86199f2450e5c15e4c7b9b1f24d161e054dc88f 100644
--- a/lib/datasource/helm/index.spec.ts
+++ b/lib/datasource/helm/index.spec.ts
@@ -21,7 +21,7 @@ describe('datasource/helm', () => {
       expect(
         await getReleases({
           lookupName: undefined,
-          registryUrls: ['example-repository.com'],
+          registryUrls: ['https://example-repository.com'],
         })
       ).toBeNull();
     });
@@ -38,7 +38,7 @@ describe('datasource/helm', () => {
       expect(
         await getReleases({
           lookupName: 'non_existent_chart',
-          registryUrls: ['example-repository.com'],
+          registryUrls: ['https://example-repository.com'],
         })
       ).toBeNull();
     });
@@ -49,7 +49,7 @@ describe('datasource/helm', () => {
       expect(
         await getReleases({
           lookupName: 'non_existent_chart',
-          registryUrls: ['example-repository.com'],
+          registryUrls: ['https://example-repository.com'],
         })
       ).toBeNull();
     });
@@ -62,7 +62,7 @@ describe('datasource/helm', () => {
       expect(
         await getReleases({
           lookupName: 'some_chart',
-          registryUrls: ['example-repository.com'],
+          registryUrls: ['https://example-repository.com'],
         })
       ).toBeNull();
     });
@@ -76,7 +76,7 @@ describe('datasource/helm', () => {
       try {
         await getReleases({
           lookupName: 'some_chart',
-          registryUrls: ['example-repository.com'],
+          registryUrls: ['https://example-repository.com'],
         });
       } catch (err) {
         e = err;
@@ -91,7 +91,7 @@ describe('datasource/helm', () => {
       expect(
         await getReleases({
           lookupName: 'some_chart',
-          registryUrls: ['example-repository.com'],
+          registryUrls: ['https://example-repository.com'],
         })
       ).toBeNull();
     });
@@ -100,7 +100,7 @@ describe('datasource/helm', () => {
       got.mockReturnValueOnce(res);
       const releases = await getReleases({
         lookupName: 'non_existent_chart',
-        registryUrls: ['example-repository.com'],
+        registryUrls: ['https://example-repository.com'],
       });
       expect(releases).toBeNull();
     });
@@ -114,7 +114,7 @@ describe('datasource/helm', () => {
       got.mockReturnValueOnce(res);
       const releases = await getReleases({
         lookupName: 'non_existent_chart',
-        registryUrls: ['example-repository.com'],
+        registryUrls: ['https://example-repository.com'],
       });
       expect(releases).toBeNull();
     });
@@ -122,18 +122,28 @@ describe('datasource/helm', () => {
       got.mockReturnValueOnce({ body: indexYaml });
       const releases = await getReleases({
         lookupName: 'non_existent_chart',
-        registryUrls: ['example-repository.com'],
+        registryUrls: ['https://example-repository.com'],
       });
       expect(releases).toBeNull();
     });
-    it('returns list of versions for normal response if index.yaml is not cached', async () => {
+    it('returns list of versions for normal response', async () => {
       got.mockReturnValueOnce({ body: indexYaml });
       const releases = await getReleases({
         lookupName: 'ambassador',
-        registryUrls: ['example-repository.com'],
+        registryUrls: ['https://example-repository.com'],
       });
       expect(releases).not.toBeNull();
       expect(releases).toMatchSnapshot();
     });
+    it('adds trailing slash to subdirectories', async () => {
+      got.mockReturnValueOnce({ body: indexYaml });
+      await getReleases({
+        lookupName: 'ambassador',
+        registryUrls: ['https://example-repository.com/subdir'],
+      });
+      expect(got.mock.calls[0][0]).toEqual(
+        'https://example-repository.com/subdir/index.yaml'
+      );
+    });
   });
 });
diff --git a/lib/datasource/helm/index.ts b/lib/datasource/helm/index.ts
index ad29e34943920d16eff7634fba65fcf8bb4436f3..d646d07d2178fd7de7056ba3ec2997237d97f70b 100644
--- a/lib/datasource/helm/index.ts
+++ b/lib/datasource/helm/index.ts
@@ -3,6 +3,7 @@ import yaml from 'js-yaml';
 import { logger } from '../../logger';
 import * as globalCache from '../../util/cache/global';
 import { Http } from '../../util/http';
+import { ensureTrailingSlash } from '../../util/url';
 import { DatasourceError, GetReleasesConfig, ReleaseResult } from '../common';
 
 export const id = 'helm';
@@ -25,7 +26,9 @@ export async function getRepositoryData(
   }
   let res: any;
   try {
-    res = await http.get('index.yaml', { baseUrl: repository });
+    res = await http.get('index.yaml', {
+      baseUrl: ensureTrailingSlash(repository),
+    });
     if (!res || !res.body) {
       logger.warn(`Received invalid response from ${repository}`);
       return null;
diff --git a/lib/datasource/rubygems/get.ts b/lib/datasource/rubygems/get.ts
index 7a0874087e093b7cbd4c5b9dffb5703a964da0cf..91e72767f0d13698d2459b09c182195a4a4326ae 100644
--- a/lib/datasource/rubygems/get.ts
+++ b/lib/datasource/rubygems/get.ts
@@ -2,6 +2,7 @@ import { OutgoingHttpHeaders } from 'http';
 import { logger } from '../../logger';
 import { Http } from '../../util/http';
 import { maskToken } from '../../util/mask';
+import { ensureTrailingSlash } from '../../util/url';
 import { ReleaseResult } from '../common';
 import { id } from './common';
 import { FORBIDDEN, NOT_FOUND, UNAUTHORIZED } from './errors';
@@ -39,7 +40,7 @@ const fetch = async ({ dependency, registry, path }): Promise<any> => {
   const headers = getHeaders();
 
   const name = `${path}/${dependency}.json`;
-  const baseUrl = registry;
+  const baseUrl = ensureTrailingSlash(registry);
 
   logger.trace({ dependency }, `RubyGems lookup request: ${baseUrl} ${name}`);
   const response = (await http.getJson(name, { baseUrl, headers })) || {