diff --git a/packages/backend/src/server/web/UrlPreviewService.ts b/packages/backend/src/server/web/UrlPreviewService.ts index 04b208909..36b3c4521 100644 --- a/packages/backend/src/server/web/UrlPreviewService.ts +++ b/packages/backend/src/server/web/UrlPreviewService.ts @@ -37,7 +37,6 @@ export class UrlPreviewService { @bindThis private wrap(url?: string | null): string | null { if (!url) return null; - if (!RegExp(/^https?:\/\//).exec(url)) return url; return appendQuery( `${this.config.mediaProxy}/preview/${encodeURIComponent(omitHttps(url))}`, diff --git a/packages/frontend/src/components/MkLink.vue b/packages/frontend/src/components/MkLink.vue index 36167e22e..32d2ae35e 100644 --- a/packages/frontend/src/components/MkLink.vue +++ b/packages/frontend/src/components/MkLink.vue @@ -9,7 +9,7 @@ SPDX-License-Identifier: AGPL-3.0-only ref="el" style="word-break: break-all;" class="_link" - :[attr]="self ? url.substring(local.length) : url" + :[attr]="maybeRelativeUrl" :rel="rel ?? 'nofollow noopener'" :target="target" :behavior="props.navigationBehavior" @@ -28,7 +28,8 @@ import { useTooltip } from '@/scripts/use-tooltip.js'; import { warningExternalWebsite } from '@/scripts/warning-external-website.js'; import * as os from '@/os.js'; import { isEnabledUrlPreview } from '@/instance.js'; -import { MkABehavior } from '@/components/global/MkA.vue'; +import type { MkABehavior } from '@/components/global/MkA.vue'; +import { maybeMakeRelative } from '@/scripts/url.js'; const props = withDefaults(defineProps<{ url: string; @@ -39,7 +40,8 @@ const props = withDefaults(defineProps<{ hideIcon: false, }); -const self = props.url.startsWith(local); +const maybeRelativeUrl = maybeMakeRelative(props.url, local); +const self = maybeRelativeUrl !== props.url; const attr = self ? 'to' : 'href'; const target = self ? null : '_blank'; diff --git a/packages/frontend/src/components/MkUrlPreview.vue b/packages/frontend/src/components/MkUrlPreview.vue index c198966bf..b99a4d02e 100644 --- a/packages/frontend/src/components/MkUrlPreview.vue +++ b/packages/frontend/src/components/MkUrlPreview.vue @@ -47,13 +47,13 @@ SPDX-License-Identifier: AGPL-3.0-only -
+
@@ -101,6 +101,7 @@ import MkButton from '@/components/MkButton.vue'; import { versatileLang } from '@/scripts/intl-const.js'; import { defaultStore } from '@/store.js'; import { warningExternalWebsite } from '@/scripts/warning-external-website.js'; +import { maybeMakeRelative } from '@/scripts/url.js'; type SummalyResult = Awaited>; @@ -118,7 +119,8 @@ const props = withDefaults(defineProps<{ const MOBILE_THRESHOLD = 500; const isMobile = ref(deviceKind === 'smartphone' || window.innerWidth <= MOBILE_THRESHOLD); -const self = props.url.startsWith(local); +const maybeRelativeUrl = maybeMakeRelative(props.url, local); +const self = maybeRelativeUrl !== props.url; const attr = self ? 'to' : 'href'; const target = self ? null : '_blank'; const fetching = ref(true); diff --git a/packages/frontend/src/components/MkUserInfo.vue b/packages/frontend/src/components/MkUserInfo.vue index f247ba8fd..ead2b6429 100644 --- a/packages/frontend/src/components/MkUserInfo.vue +++ b/packages/frontend/src/components/MkUserInfo.vue @@ -5,7 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only