server { listen 80; server_name localhost; # Handle API endpoints directly - no rewrite needed location /superset/api/ { proxy_pass http://superset:8088/api/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; 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_set_header Accept-Encoding ""; proxy_read_timeout 300s; proxy_connect_timeout 300s; proxy_send_timeout 300s; } # Strip /superset/ prefix, proxy to Superset at root location /superset/ { proxy_pass http://superset:8088/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; 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_set_header Accept-Encoding ""; proxy_read_timeout 300s; proxy_connect_timeout 300s; proxy_send_timeout 300s; # Rewrite redirect Location headers to add /superset prefix proxy_redirect ~^(https?://[^/]+)?/(.*)$ $1/superset/$2; # Rewrite URLs in HTML responses sub_filter_once off; sub_filter_types text/html application/json; sub_filter 'href="/' 'href="/superset/'; sub_filter 'src="/' 'src="/superset/'; sub_filter 'action="/' 'action="/superset/'; sub_filter '"/static/' '"/superset/static/'; sub_filter '"/api/' '"/superset/api/'; sub_filter '"/superset/superset/' '"/superset/superset/'; sub_filter '"/login/' '"/superset/login/'; sub_filter '"/logout/' '"/superset/logout/'; sub_filter '"/lang/' '"/superset/lang/'; } location = /superset { return 301 /superset/; } # Health check for Docker location = /health { proxy_pass http://superset:8088/health; } }