Nginx反向代理同Docker网络容器时Dokuwiki访问异常问题求助
问题排查方法
- 打开浏览器开发者工具的「网络」标签,刷新异常的App2页面,查看404请求的完整URL:
- 如果404的URL路径没有
/app2/前缀(比如请求的是http://myserver.home.local/lib/exe/css.php而非http://myserver.home.local/app2/lib/exe/css.php),就属于响应内容中的链接没有被正确添加前缀的问题
- 如果404的URL路径没有
- 查看Nginx的access日志,确认请求是否被正确转发到App2容器:
执行docker exec -it [你的Nginx容器名] tail -f /var/log/nginx/access.log,看/app2/开头的请求有没有被转发到172.17.0.3:8080,还是被匹配到其他location块了。
问题根因
你当前的配置只处理了入站请求的路径转发,没有解决两个核心问题:
- Dokuwiki默认不知道自己运行在
/app2/子路径下,生成的所有静态资源、页面跳转链接默认都是相对于域名根路径的 - 你只配置了请求转发,没有重写Dokuwiki返回的响应内容里的根路径链接,导致浏览器直接从域名根路径请求资源,触发404
- 另外你当前配置中默认location块的
index: index.html index.htm;有语法错误,冒号多余,应该改成index index.html index.htm;,否则Nginx启动可能会有告警。
解决方案
方案1:修改Dokuwiki配置(推荐,性能消耗最低)
直接在Dokuwiki容器内的conf/local.php配置文件中添加以下参数,指定服务的基础路径:
$conf['basedir'] = '/app2/'; $conf['baseurl'] = 'http://myserver.home.local/app2';
修改完成后重启Dokuwiki容器即可,后续Dokuwiki生成的所有链接都会自动带上/app2前缀,不需要调整Nginx的复杂规则。
方案2:调整Nginx反向代理配置
如果无法修改Dokuwiki配置,可以调整Nginx的/app2/location块规则,同时处理请求转发和响应内容重写:
location /app2/ { proxy_pass http://app2:8080/; # 传递真实请求信息给后端服务 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; # 重写响应头中的重定向地址,对应Apache的ProxyPassReverse能力 proxy_redirect http://app2:8080/ /app2/; # 重写响应内容里的根路径链接,统一加上/app2前缀 sub_filter 'href="/' 'href="/app2/'; sub_filter 'src="/' 'src="/app2/'; sub_filter 'action="/' 'action="/app2/'; sub_filter_once off; sub_filter_types text/html text/css text/javascript application/javascript; }
修改配置后执行docker exec -it [你的Nginx容器名] nginx -s reload重载配置即可生效。
内容的提问来源于stack exchange,提问作者cat Man
相关产品推荐
相关产品推荐

