2010-02-09 4 views
7

РЕШИТЬ:Как передать «/» через GET в 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. 

Когда я называю действие контроллера без каких-либо параметров или с параметром «ааа» он работает. Эти идентификаторы URI работы:

/controller/action 
/controller/action/par1/aaa 
/controller/action/par1/jfhsdajkhfui454fs 
/controller/action/par1 
/controller/action/par1/ 

Вы можете поставить http://example.com перед всеми относительными URI, выше, и это то же самое.

ответ

9

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

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

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

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

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

+0

Мне действительно удалось это решить, используя URI следующим образом:/controller/action? Ret =% 2F :) –

+0

Очень информативный ответ, bobince.Я сам не был знаком с параметром конфигурации AllowEncodedSlashes. –

2

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

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

+0

'urlencode' кодирует'/'. – bobince