Intereting Posts
Значки FontAwesome не будут отображаться в сгенерированном PDF-формате, используя mPDF Будет ли сокращение количества включений / требует повышения производительности? Как я могу использовать cURL для открытия нескольких URL одновременно с PHP? Формат даты в формате Google Sitemap Как включить файл из 2 каталогов? Сохранение значений в полях форм при неудачной проверке данных SQL Query и PHP-манипуляция с помощью модели вложенного набора OPENSSL file_get_contents (): Не удалось включить криптографию Как сделать глубокую копию объекта DateTime? cURL ошибка 35: Неизвестная ошибка протокола SSL в связи с api.mailgun getUser всегда возвращает 0 Значения привязки PDO для оператора MySQL IN Symfony 3: обработчик успешного вызова по умолчанию из настраиваемого обработчика Zend_Cache: после загрузки кэшированных данных кодировка символов кажется испорченной Интеграция MarkerClusterer с базой данных Google Map V3

url закодированные косые черты, нарушающие мое приложение codeigniter

Я пытаюсь создать строку url, которая работает следующим образом:

/app/process/example.com/index.html 

так, другими словами,

 /app/process/$URL 

Затем я извлекаю URL-адрес с помощью

 $this->uri->segment(3); 

прямая косая черта в URL-адресе, конечно, будет проблемой для доступа к сегментам uri, поэтому я продолжу и url закодировать часть URL:

 /app/process/example.com%2Findex.html 

.. но теперь я просто получаю 404 высказывание …

 Not Found The requested URL /app/process/example.com/index.html was not found on this server. 

похоже, что мое кодирование url передних косых сломает парсер URI CI.

что я могу сделать, чтобы обойти эту проблему?

Я думаю, что сообщение об ошибке, которое вы получаете, не от codeigniter, а от вашего веб-сервера.

Я реплицировал это с помощью Apache2, даже не используя CodeIgniter: я создал файл index.php, а затем обратился к index.php/a/b/c – он работал нормально. Если я затем попытался получить доступ к index.php/a/b/c%2F я получил 404 от Apache.

Я решил это, добавив в мою конфигурацию Apache:

AllowEncodedSlashes On

Дополнительную информацию см. В документации

Как только вы это сделаете, вам, возможно, придется столкнуться с $config['permitted_uri_chars'] allowed_uri_chars $config['permitted_uri_chars'] в кодеригенере, если он все еще не работает – вы можете обнаружить, что косые черты отфильтровываются

Один из способов обойти эту проблему – заменить любые косые черты в вашей переменной URL, которые вы передаете в сегментах URI, с чем-то, что не нарушит анализатор URI CodeIgniter. Например:

 $uri = 'example.com/index.html'; $pattern = '"/"'; $new_uri = preg_replace($pattern, '_', $uri); 

Это заменит все ваши косые черты с помощью подчеркивания. Я уверен, что это похоже на то, что вы делаете, чтобы кодировать ваши косые черты. Затем при извлечении значения на другой странице просто используйте что-то вроде следующего:

 $pattern = '/_/'; $old_uri = preg_replace($pattern, '/', $new_uri); 

Который заменит все подчеркивания косой чертой, чтобы вернуть старый URI. Конечно, вы захотите убедиться, что любой персонаж, который вы используете (подчеркивание в этом случае), не будет присутствовать ни в одном из возможных URI, которые вы будете передавать (так что вы, вероятно, не захотите использовать подчеркивание вообще).

Измените свой идентификатор allowed_uri_chars в файле конфигурации

 $config['permitted_uri_chars'] = 'az 0-9~%.:_\-'; 

С CodeIgniter путь к URL-адресу соответствует контроллеру, функции в контроллере и параметрам функции.

Ваш URL, /app/process/example.com/index.html, будет соответствовать контроллеру app.php, функции процесса внутри и двум параметрам example.com и index.html:

 <?php class App extends Controller { function process($a, $b) { // at this point $a is "example.com" and $b is "index.html" } } ?> 

: Перечитывая свой вопрос, кажется, что вы хотите интерпретировать часть URL как другой URL. Для этого вам нужно написать свою функцию, чтобы принять переменное количество аргументов. Для этого вы можете использовать функции func_num_args и func_get_arg следующим образом:

 <?php class App extends Controller { function process() { $url = ""; for ($i = 0; $i < func_num_args(); $i++) { $url .= func_get_arg($i) . "/"; } // $url is now the url in the address } } ?>