访问带尾斜杠的Gerrit登录页时静态图片返回401错误
环境概述
- Gerrit部署在Debian 11虚拟机,路径
/opt/gerrit/,以专属gerrit用户运行 - 核心配置片段:
[gerrit] basePath = /opt/git canonicalWebUrl = http://192.168.10.101/git/ [httpd] listenUrl = proxy-http://127.0.0.1:8080/git/ [auth] type = LDAP gitBasicAuthPolicy = LDAP
- Nginx反向代理配置遵循官方文档,监听
git.mysite.com,将/git/路径代理到127.0.0.1:8080
问题现象
- 访问
http://192.168.10.101/git/login(不带尾斜杠)时,自定义登录页的Logo加载正常 - 访问
http://192.168.10.101/git/login/(带尾斜杠,如点击Gerrit内“Sign in”跳转的URL)时,Logo无法显示,浏览器控制台提示Error 401 Unauthorized - 请求差异:带尾斜杠时会发起
login和logo.png两个GET请求,不带尾斜杠仅发起login请求
问题根源
浏览器对相对路径的解析逻辑差异导致:
- 不带尾斜杠的
/git/login被识别为文件路径,当前上下文为/git/,相对路径static/logo.png解析为/git/static/logo.png,匹配Gerrit静态资源的实际路径,无需额外认证即可加载 - 带尾斜杠的
/git/login/被识别为目录路径,当前上下文为/git/login/,相对路径static/logo.png解析为/git/login/static/logo.png,该路径不存在且触发Gerrit的LDAP认证拦截,返回401
解决方案
修改GerritSiteHeader.html中的图片路径为绝对路径,推荐两种方式:
方式一:硬编码根路径(适合固定部署路径)
<div> <img src="/git/static/logo.png" height="150" width="415"/> </div>
方式二:使用Gerrit模板变量(适配动态部署路径,推荐)
利用Gerrit内置的$contextPath变量,它会自动匹配canonicalWebUrl中的路径后缀(此处为/git),无需硬编码:
<div> <img src="$contextPath/static/logo.png" height="150" width="415"/> </div>
验证步骤
- 保存修改后的
GerritSiteHeader.html - 重启Gerrit服务:
sudo -u gerrit /opt/gerrit/bin/gerrit restart
- 清除浏览器缓存,测试带尾斜杠的登录URL,确认Logo正常加载
- 检查浏览器控制台,确认Logo的请求路径为
/git/static/logo.png
内容的提问来源于stack exchange,提问作者Davide Ghisalberti
相关产品推荐
相关产品推荐

