From 923c50bfacf1725fd899407cce4058ba3c9e0f0e Mon Sep 17 00:00:00 2001 From: Vishva Date: Tue, 4 Aug 2026 11:09:28 +0530 Subject: [PATCH] fix: priority ^~ /uploads/ routing in Nginx and share strapi_uploads volume with backend --- docker-compose.yml | 1 + nginx.conf | 56 +++++++++++++++++++------------ src/components/BlogDetailPage.jsx | 40 +++++++++++++++------- 3 files changed, 64 insertions(+), 33 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 16e754f..427dbff 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -71,6 +71,7 @@ services: volumes: - backend_uploads:/app/server/uploads - backend_data:/app/server/data + - strapi_uploads:/app/strapi-cms/public/uploads depends_on: - strapi-cms networks: diff --git a/nginx.conf b/nginx.conf index 334d662..7108ee9 100644 --- a/nginx.conf +++ b/nginx.conf @@ -2,6 +2,8 @@ server { listen 80; server_name localhost; + client_max_body_size 100M; + root /usr/share/nginx/html; index index.html; @@ -11,7 +13,39 @@ server { gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; - # Explicit handling for static assets (JavaScript, CSS, images, fonts) + # Priority prefix location for uploads - proxies to Express backend container + location ^~ /uploads/ { + proxy_pass http://backend:3005/uploads/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + } + + # Priority prefix location for backend API + location ^~ /api/ { + proxy_pass http://backend:3005/api/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # Prevent 504 Gateway Timeouts + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + } + + # Explicit handling for static JS, CSS, images, and fonts location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|map)$ { try_files $uri /citpl_website$uri =404; expires 30d; @@ -39,26 +73,6 @@ server { try_files $uri $uri/ /preview.html; } - # Proxy backend API requests to the Express backend container - location /api/ { - proxy_pass http://backend:3005/api/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_cache_bypass $http_upgrade; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } - - # Proxy media upload requests to backend - location /uploads/ { - proxy_pass http://backend:3005/uploads/; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - } - error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; diff --git a/src/components/BlogDetailPage.jsx b/src/components/BlogDetailPage.jsx index f4f8515..ccd666e 100644 --- a/src/components/BlogDetailPage.jsx +++ b/src/components/BlogDetailPage.jsx @@ -344,7 +344,7 @@ export default function BlogDetailPage({ blog, allBlogs = [], isMobile, onNaviga {/* HERO FEATURED IMAGE */} - {blog.image && ( + {(blog.image || blog.coverImage || blog.ogImage) && (
{blog.title} { + const titleLower = (blog.title || '').toLowerCase(); + const catLower = (blog.category || '').toLowerCase(); + let fallback = '/assets/arvindh_agentic_ai.jpg'; + if (titleLower.includes('llm')) fallback = '/assets/arvindh_llm_financial.jpg'; + else if (titleLower.includes('supply chain')) fallback = '/assets/arvindh_supply_chain.jpg'; + else if (titleLower.includes('prodmax')) fallback = '/assets/prodmax_dashboard.png'; + else if (titleLower.includes('vr') || titleLower.includes('incidents')) fallback = '/assets/whyus_vr_man.jpg'; + else if (titleLower.includes('scada') || titleLower.includes('plc') || titleLower.includes('speed vs')) fallback = '/assets/arvindh_agentic_ai.jpg'; + else if (catLower.includes('ai')) fallback = '/assets/arvindh_agentic_ai.jpg'; + const resolvedFallback = assetUrl(fallback); + if (e.currentTarget.src !== resolvedFallback) { + e.currentTarget.src = resolvedFallback; + } + }} />
)} @@ -646,14 +661,12 @@ export default function BlogDetailPage({ blog, allBlogs = [], isMobile, onNaviga ); } - const imgMatch = block.match(/!\[(.*?)\]\((.*?)\)/); - if (imgMatch) { - const caption = imgMatch[1] ? imgMatch[1].trim() : ''; - let rawImgUrl = imgMatch[2]; - let resolvedSrc = assetUrl(rawImgUrl); - if (rawImgUrl.startsWith('http://localhost:1337/uploads/')) { - resolvedSrc = assetUrl(rawImgUrl.replace('http://localhost:1337', '')); - } + const mdImgMatch = block.match(/!\[(.*?)\]\((.*?)\)/); + const htmlImgMatch = block.match(/]+src=["']([^"']+)["'][^>]*>/i); + if (mdImgMatch || htmlImgMatch) { + const caption = mdImgMatch ? (mdImgMatch[1] ? mdImgMatch[1].trim() : '') : ''; + const rawImgUrl = mdImgMatch ? mdImgMatch[2] : htmlImgMatch[1]; + const resolvedSrc = assetUrl(rawImgUrl); const isFilename = caption && /\.(jpg|jpeg|png|gif|webp|svg|bmp)$/i.test(caption); const displayCaption = caption && !isFilename ? caption : null; @@ -671,9 +684,12 @@ export default function BlogDetailPage({ blog, allBlogs = [], isMobile, onNaviga boxShadow: '0 15px 35px rgba(0,0,0,0.5)' }} onError={(e) => { - if (rawImgUrl.includes('/uploads/')) { + if (rawImgUrl && rawImgUrl.includes('/uploads/')) { const uploadPath = rawImgUrl.substring(rawImgUrl.indexOf('/uploads/')); - e.currentTarget.src = `http://localhost:1337${uploadPath}`; + const fallback = assetUrl(uploadPath); + if (e.currentTarget.src !== fallback) { + e.currentTarget.src = fallback; + } } }} />