2011-01-24 1 views
6

mod_rewrite кажется преобразовать символ плюс, прежде чем я получить его в $ _REQUEST, и я не знаю, что это исправить ...PHP Mod_rewrite и URL-кодированные символы - могут использовать только один из них, но не оба?

RewriteRule ^invite/([a-zA-Z0-9\-\+\/]+)/?$ invite.php?key=$1 [L,QSA] 

Например, я ввод это в мой URL,

http://mywebsite/invite/xPo8lUEXpqg8bKL%2B32o6yIOK 

я получаю это,

xPo8lUEXpqg8bKL 32o6yIOK 

но если ввод этот запрос без прохождения через mod_rewrite,

http://mywebsite/invite.php?key=xPo8lUEXpqg8bKL%2B32o6yIOK 

я получаю это то, что я хочу,

xPo8lUEXpqg8bKL+32o6yIOK 

Что я могу сделать? Или это то, что я могу использовать только их, но не оба?

Спасибо.

+0

Можете ли вы уточнить, что вы вводите и что получаете? –

+0

@Pekka: извините, я только что исправил свои ошибки в своем письме выше и уточнил мои материалы. Благодарю. – laukok

+0

+1 интересный вопрос - никогда раньше этого не встречал. –

ответ

3

Попытка добавления [B] флаг (бежать обратные ссылки):

RewriteRule ^invite/([a-zA-Z0-9\-\+\/]+)/?$ invite.php?key=$1 [L,B,QSA] 
+1

да я просто попробовал, но все тот же ... :( – laukok

1

Символ «+», зарезервирован в строку запроса часть URL в качестве пространства. Фактически статус «+» в качестве зарезервированного символа документируется в rfc3986, а его (теперь устаревшее) использование в качестве символа замены пространства документируется в rfc1630.

Поскольку Apache пытается избежать конфликта, он автоматически ускользает от «+» как строки перед передачей.


Используя [NE] (NoEscape) флаг на вашем переписывание должно предотвратить такое поведение не происходило.

RewriteRule ^invite/([a-zA-Z0-9\-\+\/]+)/?$ invite.php?key=$1 [L,NE,QSA] 

Однако при использовании этого незаменяемым «+» будет заменен пробелом, если пользователь вводит URL вручную. Чтобы быть в безопасности, просто замените все пробелы на вашем входе знаками «+».


Откровенно говоря, так как вы не согласны с места в вашем входе, просто заменить все пробелы символом «+». Использование флага [NE] может вызвать большие проблемы, а затем заменить простой символ. Достаточно простого $_GET['key'] = str_replace($_GET['key'], ' ', '+');.

+0

спасибо за это. Я просто попробовал, но все же не повезло ... любые другие варианты, пожалуйста ... – laukok

+0

@lauthiamkok: Поскольку вы не принимаете пробелы на своем входе , простой '$ _GET ['key'] = str_replace ($ _ GET ['key'], '', '+');' должно быть достаточно. Это будет ваш единственный источник пространств в любом случае. –

+0

спасибо за решение проблемы str_replace :-) – laukok