Я сталкиваюсь с подобной проблемой для mod_rewrite со знаком + в URL. Сценарий как ниже:
у нас есть URL со знаком +, который нужно переписать, например http://deskdomain/2013/08/09/a+b+c.html
RewriteRule ^/(.*) http://mobiledomain/do/urlRedirect?url=http://%{HTTP_HOST}/$1
Действие struts urlRedirect получает параметр url, вносит некоторые изменения и использует URL для другого перенаправления. Но в req.getParameter ("url") знак + меняется на пустой, содержание URL параметра
http://deskdomain/2013/08/09/a b c.html
, причина переадресации 404 не найдена. Для решения этой проблемы (обратитесь за помощью к предыдущему ответу) мы используем флаг перезаписи B (экранирование обратных ссылок) и NE (noescape)
RewriteRule ^/(.*) http://mobiledomain/do/urlRedirect?url=http://%{HTTP_HOST}/$1 [B,NE]
B, будет экранироваться от + до% 2B, NE предотвратит экранирование от mod_write% 2B до% 252B (двойной экранирование + знак), поэтому в req.getParameter("url")=http://deskdomain/2013/08/09/a+b+c.html
Я думаю, причина в том, что req.getParameter ("url") сделает для нас эскейп, знак + может стереться с нуля.
Вы можете попробовать unescape% 2B один раз для +, затем unescape + снова, чтобы очистить.
"%2B" unescape-> "+" unescape-> " "