Нет, это не совсем то же самое, что и упомянутый вопрос. Проблема заключается именно в знаках плюса и ответе на Apache: mod_rewrite: Spcaes и специальные символы в URL не работают не решает эту проблему.
Существует также проблема с косыми чертами, для которой см. http://httpd.apache.org/docs/current/mod/core.html#allowencodedslashes
(но вам нужен доступ к конфигурации Apache для этого - .htaccess не будет делать).
На самом деле невозможно сделать, используя только правило перезаписи. Apache декодирует URL-адрес перед его перезаписью, , но он не понимает плюсов: http://example.com/a+b.html не доставит файл с именем
"a b.html".
Знаки плюса декодируются PHP в массив $ _GET (или любой другой механизм языка) для строк запроса, потому что обработчики форм в браузерах вставляют их. Поэтому Apache преобразует% 2B в + перед применением перезаписи, и оставь + себя в покое, что означает, что ты не можешь различить разницу.
Конечно, можно утверждать, что + используемый в качестве пробела просто недопустим в таких URL, и следует использовать только% 20. Однако, если вы не контролируете их создание, вы обязательно их увидите. Браузеры не будут генерировать их автоматически.
Ответ - «Сделай сам», и во многих отношениях он более предсказуем и прост:
RewriteRule. * Index.php [L]
Следовательно, все превращается в index.php, и нет попытки создать строку запроса. Если вы хотите исключить определенные шаблоны, например, для тех, у кого есть косые черты, или где существует явный файл, применяются очевидные поправки. например
RewriteCond% {REQUEST_FILENAME}! -F
Затем в index.php
$ uri = substr ($ _ SERVER ['REQUEST_URI'], 1); // удаляем косую черту
$ qmpos = strpos ($ uri, '?'); // есть ли знак вопроса, если да, то где
if ($ qmpos! == FALSE) {$ uri = substr ($ uri, 0, $ qmpos); } // только бит перед q.m.
$ decoded = urldecode ($ uri); // декодируем часть перед URL
if (! Empty ($ decoded)) {$ _GET ['args'] = $ decoded; } // добавляем результат в $ _GET
Это декодирует исходный запрос (исключая начальную косую черту - будет немного другим, если вы находитесь ниже по иерархии, но принцип тот же - и исключая любую дополнительную строку запроса), и декодирует параметр args в соответствии с обычными правилами PHP и помещает его в $ _GET, чтобы вы могли обрабатывать его вместе с остальными параметрами строки запроса $ _GET обычным способом.
Я считаю, что это должно работать для пустых URL-адресов (http://example.com/) или для тех, у которых есть только строка запроса (http://example.com/?foo=1),, а также простой случай (http://example.com/bar) и случай с также строка запроса (http://example.com/bar?foo=1). Без сомнения, аналогичные подходы будут работать для других языков.
В вашем конкретном случае вы вообще не хотите, чтобы плюсы декодировались в PHP вообще. Это нормально, используйте вместо этого rawurldecode, который не имеет плюсов.