使用nginx-proxy路径路由时应用资源出现404错误的解决方法
解决nginx-proxy路径路由下静态资源404问题
核心原因
你配置的VIRTUAL_PATH=/dozzle/仅实现了请求转发,但目标应用(如dozzle)输出的静态资源使用绝对路径(比如/assets/),浏览器会直接请求http://media.local/assets/而非http://media.local/dozzle/assets/,导致资源找不到。
方案1:通过nginx-proxy添加路径重写规则
- 在你挂载的
./nginx/vhost.d目录下,创建名为media.local的配置文件(文件名必须与VIRTUAL_HOST的值一致) - 写入以下nginx配置:
# 针对dozzle的assets路径做重写 location /assets/ { rewrite ^/assets/(.*)$ /dozzle/assets/$1 break; proxy_pass http://dozzle:8080/assets/; proxy_set_header Host $host; } # 通用规则:匹配所有常见静态资源路径(可根据实际调整) location ~ ^/(assets|js|css|img)/ { rewrite ^/(.*)$ /dozzle/$1 break; proxy_pass http://dozzle:8080/$1; proxy_set_header Host $host; }
- 重启nginx-proxy容器生效:
docker-compose restart nginx-proxy
方案2:配置应用的上下文路径(推荐)
多数支持反向代理的应用都能通过环境变量指定上下文路径,以dozzle为例,它提供BASE_PATH参数,修改你的Docker Compose配置:
dozzle: container_name: dozzle image: amir20/dozzle:latest volumes: - /var/run/docker.sock:/var/run/docker.sock environment: - VIRTUAL_HOST=media.local - VIRTUAL_PATH=/dozzle/ - VIRTUAL_PORT=8080 - BASE_PATH=/dozzle/ # 新增该行,指定应用的上下文路径
修改后重启dozzle容器,应用会自动将所有静态资源路径前缀设为/dozzle/,浏览器就能正确请求到资源。
验证方法
访问http://media.local/dozzle/,打开浏览器开发者工具的「网络」面板,确认静态资源的请求路径包含/dozzle/前缀,且返回状态码为200。
内容的提问来源于stack exchange,提问作者PaulH
相关产品推荐
相关产品推荐

