到目前为止,我的gitweb安装工作正常,但所有生成的链接都包含查询字符串,例如:
host/gitweb?p=somepath;a=summary
某种程度上是畸形的。 首先,用分号代替&符号。检查html时,链接看起来像
host/gitweb?p=somepath%3ba=summary
当点击该链接时,浏览器会退出&#39 ;;'到'%3b',所以发送到服务器的网址看起来像
$href .= "?" . join(';', @result) if scalar @result;
gitweb.cgi 不会解析此问题并显示404错误页面。当我更换'%3b'与';'或者'&',一切正常。
如何在服务器端修复此问题?
到目前为止,我试图找到产生&#39 ;;'在网址中,这是第1457行
$feature{'pathinfo'}{'default'} = [1];
替换';'通过'&'在浏览器中给我一个格式错误的xhtml。用'& amp;'取而代之。再次强制浏览器逃避&#39 ;;'这会再次产生破坏的网址。
如果我设置选项
,问题就是隐藏(我可以查看存储库){{1}}gitweb.conf 文件中的
,但遗憾的是,由于相应的链接使用了一些查询参数,因此无法显示包含多个存储库的文件夹。
答案 0 :(得分:0)
您没有将查询字符串编码或解码为洞。 必须单独编码和解码param名称和值以及查询字符串的分隔符,即..
= ; &
永远不会对URL进行编码或解码。
您可以检查服务器环境变量$ENV{REQUEST_URI}
以查看服务器是否确实收到了您所说的编码信息。如果浏览器正在发送它,那么这就是问题所在,您无法在Perl代码中做任何事情来解决这个问题。因为它只会在您的Perl代码中导致更多问题。
答案 1 :(得分:0)
我在apache中使用重写规则以某种方式解决了这个问题:
RewriteEngine on
RewriteCond %{QUERY_STRING} ^a=project_list%3bpf=(.*)$
RewriteRule (.*) $1?a=project_list;pf=%1 [QSA]
它仅适用于具有启用了pathinfo功能的指定路径的项目列表。整体方法是搜索所有可能的查询参数并将其全部替换。
然而,这个解决方案并不令人满意,因为它无法解决gitweb奇怪的网址逃逸的实际问题。