PHP $ _GET var с urlencode и ошибкой "&" - PullRequest
3 голосов
/ 08 июля 2011

В своем коде я создаю такую ​​ссылку:

$link = 'http://www.mydomain.com/'.urlencode($str).'/1';

Я использую переписывание URL, и правило в моем файле htaccess выглядит так:

rewriteRule ^(.+)/(.*)$ index.php?var1=$1&var2=$2 [NC,L]

Этот код отлично работает практически для всех строк. Но иногда строка для кодирования содержит «&». Функция urlencode кодирует его в основном, но когда я читаю массив $ _GET в php, он выглядит так (с $ str = 'substring1 & substring2'):

'var1' => 'substring1' (without "&")
'substring2' => '' (without "&")
'var2' => 1

Мне действительно нужно "&" в моей переменной. Есть ли способ закодировать этот символ, чтобы он работал?

Кроме того, я действительно не знаю, почему, но иногда я получаю запрещенную ошибку http с некоторыми строками, переданными как var1. Видимо, в них нет ничего особенного, например, «Площадь Декари» допускает эту ошибку. Другие строки с пробелами и "é" работают нормально.

Ответы [ 4 ]

1 голос
/ 08 июля 2011

Apache mod_rewrite автоматически декодирует urlencoded строки, когда выполняет сопоставление с регулярным выражением. Но он делает это только один раз, так что вам следует это делать, если вы дважды закручиваете свою строку. Это снова экранирует все эти символы `% '.

попробовать

$link = 'http://www.mydomain.com/'.urlencode(urlencode($str)).'/1';

или перестаньте полагаться на правила перезаписи и используйте инфраструктуру, которая правильно обрабатывает URL-маршрутизацию.

О, и где-то там должно быть htmlentities().

1 голос
/ 08 июля 2011

Apache автоматически переведет (расшифрует) путь. Вы должны использовать другую кодировку или даже двойную кодировку. База 64 будет работать.

0 голосов
/ 08 июля 2011

ваш $ str не настроен с парами ключ = вал

Попробуйте $str = 'var1=substr1&var2=substr2';

0 голосов
/ 08 июля 2011

Два варианта:

  • Urlencode строка перед urlencoding запроса.
  • Заменить все не буквенно-цифровые символы с тире или подчеркиванием

Что касается запрещенной ошибки, вы используете http auth basic или digest?

Обновление может по ошибке попробовать htmlentities или htmlspecialchars вместо urlencode

...