Gitweb URL在查询字符串中转义

时间:2016-08-29 16:11:57

标签: perl url cgi gitweb

到目前为止,我的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 文件中的

,但遗憾的是,由于相应的链接使用了一些查询参数,因此无法显示包含多个存储库的文件夹。

2 个答案:

答案 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奇怪的网址逃逸的实际问题。