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