PHP Mod_rewrite и URL-кодированные символы - можно использовать только один из них, но не оба? - PullRequest
6 голосов
/ 24 января 2011

Кажется, что mod_rewrite преобразует символ плюс, прежде чем я получу его в $ _REQUEST, и я не знаю, как это исправить ...

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

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

Спасибо.

Ответы [ 2 ]

3 голосов
/ 24 января 2011

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

RewriteRule ^invite/([a-zA-Z0-9\-\+\/]+)/?$   invite.php?key=$1 [L,B,QSA]
1 голос
/ 24 января 2011

Символ "+" зарезервирован в части строки запроса 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'], ' ', '+'); должно хватить.

...