Проблема с кодированием специальных символов для URL через текстовый ввод - PullRequest
0 голосов
/ 25 января 2009

Я создаю приложение PHP с использованием CodeIgniter. Это похоже на Let Me Google That For You, когда вы записываете предложение в текстовое поле ввода, нажимаете кнопку «Отправить», и вы переходите по URL, который отображает результат. Я хотел, чтобы URL был удобен для редактирования и был относительно простым. Я справился с маршрутизацией URL CodeIgniter, поэтому сейчас мои URL могут выглядеть примерно так:

http://website.com/?q=this+is+a+normal+url

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

http://website.com/?q=this+is+a+normal+url? OR
http://website.com/?q=this+is+a+normal+url%3F

Что работает, так это двойное кодирование. Например, если я возьму знак вопроса и закодирую его в %253F (где символ? Закодирован в% 3F, а знак% - в% 25). Этот URL работает правильно.

http://website.com/?q=this+is+a+normal+url%253F

Кто-нибудь имеет представление о том, что я могу здесь сделать? Есть ли умный способ двойного кодирования ввода? Могу ли я написать .htaccess правило переписывания, чтобы обойти это? Я в недоумении здесь. Вот правила переписывания, которые я сейчас использую для всех.

RewriteEngine on
RewriteCond %{QUERY_STRING} ^q=(.*)$
RewriteRule ^(.*)$ /index.php/app/create/%{QUERY_STRING}? [L]

Примечание : КодIgniter работает так, как будто он настроил URL index/application/function/parameter. Я передаю функции полную строку запроса прямо сейчас.

Ответы [ 2 ]

1 голос
/ 26 января 2009

Если вы используете Apache 2.2 и более поздние версии, вы можете использовать флаг B , чтобы избежать обратной ссылки:

RewriteCond %{QUERY_STRING} ^q=.*
RewriteRule ^ /index.php/app/create/%0? [L,B]
0 голосов
/ 25 января 2009

Я обычно делаю читабельные URL-адреса, подобные этому

$humanReadableUrl= implode("_",preg_split('/\W+/', trim($input), -1, PREG_SPLIT_NO_EMPTY)); 

Он удалит все несловарные символы и добавит подчеркивание между словами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...