Как я могу передать “/” через, Входят в URI?

РЕШЕННЫЙ:

Этот 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 выше, и это - то же.

7
задан Richard Knop 9 February 2010 в 23:11
поделиться

3 ответа

Вы почти все делаете правильно. Единственная небольшая ошибка заключается в том, что urlencode предпочтет использовать плюс для обозначения пробела, который подходит только для параметров запроса, а не для части пути. rawurlencode здесь будет лучше.

Однако это не причина, по которой это не работает. Вы уже создали правильный путь / controller / action / par1 /% 2F .

На практике это не работает для вас, потому что Apache пытается защитить вас (довольно неэффективным способом) от проблем с обходом каталогов. Если вы включите последовательность % 2F в путь URL-адреса, Apache по умолчанию перейдет и покажет вашу собственную страницу 404 (игнорируя любые настройки документа с ошибками). Чтобы отключить эту функцию (IMO: misfeature), вы можете использовать директиву конфигурации AllowEncodedSlashes .

Сможете ли вы действительно получить закодированную косую черту, когда она вернется в ваш скрипт, - это еще одна баня червей. Из-за плохого дизайна переменной PATH_INFO в исходной спецификации CGI многие среды не смогут увидеть % 2F как нечто отличное от незашифрованного / , потенциально нарушая маршрутизацию, которую вы выполняете из частей пути.

Обычно лучше избегать косой черты в частях пути, потому что Apache - не единственный сервер или язык, которые могут запутать их.В общем, вы должны использовать параметры запроса для ввода, где вам нужно иметь возможность принимать любую строку байтов или символов, потому что части пути имеют практические проблемы на многих серверах с (a) / , (b) ] \ , (c) символ NUL и (d) пустые строки.

9
ответ дан 6 December 2019 в 21:13
поделиться
1
ответ дан 6 December 2019 в 21:13
поделиться

Попробуйте % 2F . Я не думаю, что urlencode будет кодировать '/' , потому что это допустимый синтаксис URL.

[ Изменить ]: оцените голоса, но, похоже, мой ответ неверен. См. Правильный (и гораздо более подробный) ответ Бобинса ниже выше.

2
ответ дан 6 December 2019 в 21:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: