2016-08-29 7 views
1

Моя установка gitweb работает до сих пор, но все сгенерированные ссылки, которые включают в себя запрос, например.URL-адрес Gitweb в строке запроса

host/gitweb?p=somepath&a=summary 

как-то искажен. Во-первых, амперсанд заменяется точкой с запятой. При осмотре HTML, ссылка выглядит

host/gitweb?p=somepath;a=summary 

Когда или выписка по ссылке, браузер экранирует «;» на «% 3b», так что URL отправляется на сервер выглядит как

host/gitweb?p=somepath%3ba=summary 

gitweb.cgi не анализирует это и отображает страницу 404 ошибки. Когда я заменю '% 3b' на ';' или '&', все работает нормально.

Как это можно зафиксировать на стороне сервера?

До сих пор я пытался найти линию, производящую ';' в строках 1457

$href .= "?" . join(';', @result) if scalar @result; 

замена ';' по '&' дает мне неправильный xhtml в браузере. Замена его на '& amp;' снова заставляет браузер скрыться от ';' который снова создает сломанные URL-адреса.

Выпуск рода скрытый (я могу просмотреть репозиториев), если установить опцию

$feature{'pathinfo'}{'default'} = [1]; 

в gitweb.conf файл, но, к сожалению, папки, содержащие несколько хранилищ не могут быть отображены, поскольку соответствующая ссылка использует некоторые параметры запроса.

+0

Re "* браузер избегает ';' до «% 3b» * «Нет». Это не будет законным. – ikegami

+0

Re "* заменить ';' '&' дает мне неправильный xhtml в браузере. * ", У вас есть ошибка внедрения XHTML.Вы забыли избежать текста (URL), который вы встроили в XHTML. '&' необходимо заменить на '&' – ikegami

+0

Замена ';' по '&' тоже не работает, так как снова ';' когда я нажимаю на ссылку. – quantenquatsch

ответ

0

Вы не закодировали и не расшифровали строку запроса как отверстие. Имя паров и значение должны быть закодированы и декодируются индивидуально и разделители из строки запроса .. т.е.

= ; & 

никогда не получить URL закодированы или декодирование.

Вы можете проверить переменную окружения сервера $ENV{REQUEST_URI}, чтобы узнать, получил ли сервер информацию, закодированную так, как вы сказали. Если браузер отправляет его, это проблема, и вы ничего не можете сделать в своем коде Perl, чтобы исправить это. Потому что это просто вызовет больше проблем в вашем коде Perl.

+0

Я добавил команду 'die $ ENV {' REQUEST_URI '}' к моему gitweb.conf, который получил мне следующую строку в журнале ошибок apache: '[Вт 30 августа 18: 37: 08.416866 2016] [cgi: error] [pid 32381] [клиент 141.30.155.71:54651] AH01215: [Вт 30 авг 18:37:08 2016] gitweb.cgi: FATAL: [Вт 30 авг 18:37:08 2016] gitweb.cgi: FATAL: /gitweb/gitweb.cgi?a=project_list%3bpf=projects/foo в строке /home/git/gitweb.conf 61. ' - Кажется, браузер отправляет запрос, напечатанный в строке местоположения. Возможно, я могу переписать запрос через Apache, чтобы заменить '% 3b' на ';' ... – quantenquatsch

0

я как-то решить эту проблему с помощью правила перезаписи апача:

RewriteEngine on 
RewriteCond %{QUERY_STRING} ^a=project_list%3bpf=(.*)$ 
RewriteRule (.*) $1?a=project_list;pf=%1 [QSA] 

Он работает только для списка проектов с заданной траекторией с функцией Pathinfo включена. Целый подход заключался бы в поиске всех возможных параметров запроса и их замене.

Однако это решение не является удовлетворительным, так как оно не фиксирует актуальную проблему странного вывоза URL-адресов gitweb.

+0

Для чего это стоит, у меня была эта же проблема и исправлена, добавив флаг NE в мои существующие директивы RewriteRule в моей конфигурации Apache. См. Также http://stackoverflow.com/questions/18323782/semi-colons-in-url-changes-to-3b-via-htaccess – ctrueden

 Смежные вопросы

  • Нет связанных вопросов^_^