Zend Framework: Apache декодирует закодированный URL вместо передачи закодированного URL? - PullRequest
5 голосов
/ 14 октября 2010

Я тестирую свое приложение Zend Framework, используя Selenium и PHPUnit.У меня есть тест, который должен открыть URL-адрес, содержащий закодированный URL-адрес.

$redirectToLocation = urlencode('/myothercontroller/action'); // %2Fmyothercontroller%2Faction
$this->openAndWait('/controller/action/thenRedirectTo/' . $redirectToLocation);

Но при запуске теста браузер попытался открыть декодированный URL-адрес:

/controller/action/thenRedirectTo//myothercontroller/action

Чтоя должен сделать, чтобы получить селен, чтобы открыть закодированный URL?

Обновление: На самом деле ... оказывается, что селен выполняет свою работу, но кажется, что Apache декодирует URL перед этимполучает к контроллеру:

The requested URL /controller/action/thenRedirectTo//myothercontroller/action was not found on this server.

Как мне решить эту проблему?

Обновление: Вот целый разговор о той же проблеме, что и у меня: http://old.nabble.com/URL-Encoding-td18850769.html. Их обходной путь состоял в том, чтобы base64 закодировать URL, но для меня этого недостаточно.Я могу использовать это решение в краткосрочной перспективе, но я хочу знать, какова реальная причина этой проблемы, поэтому я могу устранить ее.

Обновление: У меня есть сотрудниккто думает, что может быть проблема с тем, как Zend Framework направляет запрос.Как вы думаете, это может быть так?

Ответы [ 5 ]

2 голосов
/ 24 декабря 2010

Это Apache "особенность". Закодированные косые черты автоматически декодируются и отправляются в приложение (php). Поэтому он распознается как один длинный URI вместо URI с закодированным URI в качестве параметра.

Тем не менее, это можно отключить, используя AllowEncodedSlashes On в вашей конфигурации. Больше информации в Руководстве по Apache . Обратите внимание, что контекст этой директивы - конфигурация сервера и виртуальный хост, поэтому вы не можете поместить его в файл .htaccess.

0 голосов
/ 22 декабря 2010

Похоже, что Проблема Zend Framwork относится к вашей проблеме.Для проверки откройте Zend / Controller / Request / Http.php и удалите вызовы функции urldecode, но оставьте переменные на месте и повторите тестирование вашего кода.

0 голосов
/ 29 октября 2010

Я сталкивался с таким поведением раньше, и это был mod_rewrite, который делал декодирование.Насколько я знаю, единственный способ обойти это - urlencode часть URL-адреса запроса, которая должна дважды сохранять специальные символы.

0 голосов
/ 22 декабря 2010

Вы должны установить свой mod_rewrite в режиме отладки в Apache и посмотреть, что он делает:

RewriteEngine on
RewriteLog /tmp/rewrite.log
RewriteLogLevel 9

и показать нам свои правила перезаписи ZF.он определенно основан на% {QUERY_STRING}, который является конкурентно декодированным URL.Мы могли бы попытаться переработать его с% {THE_REQUEST}, который является не декодированным URL.Лучше всего было бы обрабатывать% {THE_REQUEST} только для правильного контроллера.

Другим решением может быть использование кодировки base64 для URL, чтобы mod_rewrite и любые другие инструменты никогда не перехватывали его как информацию URL.1006 *

Еще одна вещь для тестирования - это [B] на mod_rewrite, как объяснено здесь: Как кодировать специальные символы, используя mod_rewrite & Apache? .Но мне интересно, что бы не нарушать правило перезаписи.

0 голосов
/ 16 октября 2010

Интересная проблема. Лично у меня никогда не было проблем с передачей другого URL в строке запроса, например / controller / action / thenRedirectTo? Q =% 2Fmyothercontroller% 2Faction, но я долгое время не использовал Apache, и это не совсем то, что вы пытаемся сделать.

Одним из возможных решений может быть двойное кодирование URL.

$redirectToLocation = urlencode(urlencode('/myothercontroller/action'));
$this->openAndWait('/controller/action/thenRedirectTo/' . $redirectToLocation);

Возможно, Apache расшифрует его только на один уровень.

...