PHP $ _GET var с urlencode и ошибкой «&»

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

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

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

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

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

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

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

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

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

пытаться

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

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

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

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

ваша $ str не настроена с помощью пары key = val

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

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

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

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

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