РЕШЕННЫЙ:
Этот URI работы:
/controller/action?ret=%2F
Я хочу передать дополнительное "/" параметр к действию контроллера. Таким образом, я сделал это:
$par1 = urlencode('/');
$this->_redirect('/controller/action/par1/' . $par1);
Но я получаю это сообщение об ошибке:
Not Found
The requested URL /controller/action/ret// was not found on this server.
Когда я называю действие контроллера без любых параметров, или с параметром "aaa" это работает. Эти URIs работа:
/controller/action
/controller/action/par1/aaa
/controller/action/par1/jfhsdajkhfui454fs
/controller/action/par1
/controller/action/par1/
Можно поместить http://example.com перед всем относительным URIs выше, и это - то же.
Вы почти все делаете правильно. Единственная небольшая ошибка заключается в том, что urlencode
предпочтет использовать плюс для обозначения пробела, который подходит только для параметров запроса, а не для части пути. rawurlencode
здесь будет лучше.
Однако это не причина, по которой это не работает. Вы уже создали правильный путь / controller / action / par1 /% 2F
.
На практике это не работает для вас, потому что Apache пытается защитить вас (довольно неэффективным способом) от проблем с обходом каталогов. Если вы включите последовательность % 2F
в путь URL-адреса, Apache по умолчанию перейдет и покажет вашу собственную страницу 404 (игнорируя любые настройки документа с ошибками). Чтобы отключить эту функцию (IMO: misfeature), вы можете использовать директиву конфигурации AllowEncodedSlashes .
Сможете ли вы действительно получить закодированную косую черту, когда она вернется в ваш скрипт, - это еще одна баня червей. Из-за плохого дизайна переменной PATH_INFO
в исходной спецификации CGI многие среды не смогут увидеть % 2F
как нечто отличное от незашифрованного /
, потенциально нарушая маршрутизацию, которую вы выполняете из частей пути.
Обычно лучше избегать косой черты в частях пути, потому что Apache - не единственный сервер или язык, которые могут запутать их.В общем, вы должны использовать параметры запроса для ввода, где вам нужно иметь возможность принимать любую строку байтов или символов, потому что части пути имеют практические проблемы на многих серверах с (a) /
, (b) ] \
, (c) символ NUL и (d) пустые строки.
Попробуйте % 2F
. Я не думаю, что urlencode
будет кодировать '/'
, потому что это допустимый синтаксис URL.
[ Изменить ]: оцените голоса, но, похоже, мой ответ неверен. См. Правильный (и гораздо более подробный) ответ Бобинса ниже выше.