From 43541a12c97a96db6f4d0fa777e3b99c5b0b9427 Mon Sep 17 00:00:00 2001 From: kjs Date: Fri, 6 Feb 2026 12:10:07 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20API=20URL=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 프로덕션 URL에서 /api를 제거하는 로직을 수정하여, 호스트명의 /api까지 제거되는 버그를 방지하였습니다. - API_BASE_URL 및 NEXT_PUBLIC_API_URL에서 문자열 끝의 /api만 제거하도록 정규 표현식을 사용하였습니다. - FileViewerModal 컴포넌트에서 다운로드 URL 생성 시에도 동일한 수정이 적용되었습니다. --- frontend/lib/api/client.ts | 5 ++++- frontend/lib/api/file.ts | 4 +++- .../lib/registry/components/file-upload/FileViewerModal.tsx | 4 +++- .../registry/components/v2-file-upload/FileViewerModal.tsx | 4 +++- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/frontend/lib/api/client.ts b/frontend/lib/api/client.ts index 9b5b7aea..8867f96f 100644 --- a/frontend/lib/api/client.ts +++ b/frontend/lib/api/client.ts @@ -62,7 +62,10 @@ export const getFullImageUrl = (imagePath: string): string => { } // SSR 또는 알 수 없는 환경에서는 API_BASE_URL 사용 (fallback) - const baseUrl = API_BASE_URL.replace("/api", ""); + // 주의: 프로덕션 URL이 https://api.vexplor.com/api 이므로 + // 단순 .replace("/api", "")는 호스트명의 /api까지 제거하는 버그 발생 + // 반드시 문자열 끝의 /api만 제거해야 함 + const baseUrl = API_BASE_URL.replace(/\/api$/, ""); if (baseUrl.startsWith("http://") || baseUrl.startsWith("https://")) { return `${baseUrl}${imagePath}`; } diff --git a/frontend/lib/api/file.ts b/frontend/lib/api/file.ts index f848c7e6..042c555c 100644 --- a/frontend/lib/api/file.ts +++ b/frontend/lib/api/file.ts @@ -274,7 +274,9 @@ export const getDirectFileUrl = (filePath: string): string => { } // SSR 또는 알 수 없는 환경에서는 환경변수 사용 (fallback) - const baseUrl = process.env.NEXT_PUBLIC_API_URL?.replace("/api", "") || ""; + // 주의: 프로덕션 URL이 https://api.vexplor.com/api 이므로 + // 단순 .replace("/api", "")는 호스트명의 /api까지 제거하는 버그 발생 + const baseUrl = process.env.NEXT_PUBLIC_API_URL?.replace(/\/api$/, "") || ""; if (baseUrl.startsWith("http://") || baseUrl.startsWith("https://")) { return `${baseUrl}${filePath}`; } diff --git a/frontend/lib/registry/components/file-upload/FileViewerModal.tsx b/frontend/lib/registry/components/file-upload/FileViewerModal.tsx index 9eb0edeb..36e37044 100644 --- a/frontend/lib/registry/components/file-upload/FileViewerModal.tsx +++ b/frontend/lib/registry/components/file-upload/FileViewerModal.tsx @@ -284,7 +284,9 @@ export const FileViewerModal: React.FC = ({ file, isOpen, } } else { // 기타 파일은 다운로드 URL 사용 - const url = `${API_BASE_URL.replace("/api", "")}/api/files/download/${file.objid}`; + // 주의: 프로덕션 URL이 https://api.vexplor.com/api 이므로 + // 끝의 /api만 제거해야 호스트명이 깨지지 않음 + const url = `${API_BASE_URL.replace(/\/api$/, "")}/api/files/download/${file.objid}`; setPreviewUrl(url); } } else { diff --git a/frontend/lib/registry/components/v2-file-upload/FileViewerModal.tsx b/frontend/lib/registry/components/v2-file-upload/FileViewerModal.tsx index 9eb0edeb..36e37044 100644 --- a/frontend/lib/registry/components/v2-file-upload/FileViewerModal.tsx +++ b/frontend/lib/registry/components/v2-file-upload/FileViewerModal.tsx @@ -284,7 +284,9 @@ export const FileViewerModal: React.FC = ({ file, isOpen, } } else { // 기타 파일은 다운로드 URL 사용 - const url = `${API_BASE_URL.replace("/api", "")}/api/files/download/${file.objid}`; + // 주의: 프로덕션 URL이 https://api.vexplor.com/api 이므로 + // 끝의 /api만 제거해야 호스트명이 깨지지 않음 + const url = `${API_BASE_URL.replace(/\/api$/, "")}/api/files/download/${file.objid}`; setPreviewUrl(url); } } else {