diff --git a/seerr/rootfs/etc/cont-init.d/32-nginx_ingress.sh b/seerr/rootfs/etc/cont-init.d/32-nginx_ingress.sh index 3eda69587..a3f00c6c0 100644 --- a/seerr/rootfs/etc/cont-init.d/32-nginx_ingress.sh +++ b/seerr/rootfs/etc/cont-init.d/32-nginx_ingress.sh @@ -12,9 +12,13 @@ ingress_port=$(bashio::addon.ingress_port) ingress_interface=$(bashio::addon.ip_address) ingress_entry=$(bashio::addon.ingress_entry) +# Build escaped version of ingress_entry for JavaScript contexts (e.g., \/_next) +ingress_entry_escaped="${ingress_entry//\//\\\\/}" + # Update ingress.conf with actual values sed -i "s|%%port%%|${ingress_port}|g" /etc/nginx/servers/ingress.conf sed -i "s|%%interface%%|${ingress_interface}|g" /etc/nginx/servers/ingress.conf +sed -i "s|%%ingress_entry_escaped%%|${ingress_entry_escaped}|g" /etc/nginx/servers/ingress.conf sed -i "s|%%ingress_entry%%|${ingress_entry}|g" /etc/nginx/servers/ingress.conf bashio::log.info "Nginx ingress configured on ${ingress_interface}:${ingress_port}" diff --git a/seerr/rootfs/etc/nginx/servers/ingress.conf b/seerr/rootfs/etc/nginx/servers/ingress.conf index b9fcc2f9c..41e47ecc9 100644 --- a/seerr/rootfs/etc/nginx/servers/ingress.conf +++ b/seerr/rootfs/etc/nginx/servers/ingress.conf @@ -23,44 +23,30 @@ server { add_header X-Frame-Options "SAMEORIGIN"; add_header 'Referrer-Policy' 'no-referrer'; - # Correct base_url for ingress + # Redirect location headers absolute_redirect off; - proxy_redirect / %%ingress_entry%%/; + proxy_redirect ^ %%ingress_entry%%; + proxy_redirect /setup %%ingress_entry%%/setup; + proxy_redirect /login %%ingress_entry%%/login; + + # Sub filters to replace hardcoded paths + # Based on https://github.com/seerr-team/seerr/blob/develop/docs/extending-seerr/reverse-proxy.mdx sub_filter_once off; - sub_filter_types text/html text/css text/javascript application/javascript application/json; - - # Rewrite Next.js static assets - sub_filter '/_next/' '%%ingress_entry%%/_next/'; - - # Rewrite API paths - sub_filter '"/api/v1' '"%%ingress_entry%%/api/v1'; - sub_filter "'/api/v1" "'%%ingress_entry%%/api/v1"; - sub_filter '`/api/v1' '`%%ingress_entry%%/api/v1'; - - # Rewrite image proxy paths - sub_filter '"/imageproxy' '"%%ingress_entry%%/imageproxy'; - sub_filter '"/avatarproxy' '"%%ingress_entry%%/avatarproxy'; - sub_filter "'/imageproxy" "'%%ingress_entry%%/imageproxy"; - sub_filter "'/avatarproxy" "'%%ingress_entry%%/avatarproxy"; - - # Rewrite API docs path - sub_filter '"/api-docs' '"%%ingress_entry%%/api-docs'; - - # Rewrite root href/src references - sub_filter 'href="/' 'href="%%ingress_entry%%/'; - sub_filter 'src="/' 'src="%%ingress_entry%%/'; - sub_filter 'action="/' 'action="%%ingress_entry%%/'; - sub_filter 'content="/' 'content="%%ingress_entry%%/'; - - # Rewrite fetch/router paths in JavaScript - sub_filter 'fetch("/' 'fetch("%%ingress_entry%%/'; - sub_filter "fetch('/" "fetch('%%ingress_entry%%/"; - sub_filter 'fetch(`/' 'fetch(`%%ingress_entry%%/'; - sub_filter 'router.push("/' 'router.push("%%ingress_entry%%/'; - sub_filter "router.push('/" "router.push('%%ingress_entry%%/"; - sub_filter 'router.push(`/' 'router.push(`%%ingress_entry%%/'; - sub_filter 'router.replace("/' 'router.replace("%%ingress_entry%%/'; - sub_filter "router.replace('/" "router.replace('%%ingress_entry%%/"; - sub_filter 'window.location.href="/' 'window.location.href="%%ingress_entry%%/'; + sub_filter_types *; + sub_filter 'href="/"' 'href="%%ingress_entry%%"'; + sub_filter 'href="/login"' 'href="%%ingress_entry%%/login"'; + sub_filter 'href:"/"' 'href:"%%ingress_entry%%"'; + sub_filter '\/_next' '%%ingress_entry_escaped%%\/_next'; + sub_filter '/_next' '%%ingress_entry%%/_next'; + sub_filter '/api/v1' '%%ingress_entry%%/api/v1'; + sub_filter '/login/plex/loading' '%%ingress_entry%%/login/plex/loading'; + sub_filter '/images/' '%%ingress_entry%%/images/'; + sub_filter '/imageproxy/' '%%ingress_entry%%/imageproxy/'; + sub_filter '/avatarproxy/' '%%ingress_entry%%/avatarproxy/'; + sub_filter '/android-' '%%ingress_entry%%/android-'; + sub_filter '/apple-' '%%ingress_entry%%/apple-'; + sub_filter '/favicon' '%%ingress_entry%%/favicon'; + sub_filter '/logo_' '%%ingress_entry%%/logo_'; + sub_filter '/site.webmanifest' '%%ingress_entry%%/site.webmanifest'; } }