Ну, я в основном согласен с @akond. Но я сделал несколько тестов, вы можете заставить apache не переписывать символы в ответе, добавив тег NE . Таким образом, ваша строка будет:
RewriteRule .* http://%{HTTP_HOST}/%1 [R=301,NE,L]
В моих первых тестах я не заметил никаких изменений, но на самом деле кажется, что мой firefox уже отправлял 'хороший' запрос с активированной кодировкой URL . Таким образом, ответ был также закодирован в URL. Поэтому я попытался с telnet :
Без [NE]:
telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
GET //контакты HTTP/1.1
Host: myvhost.com
HTTP/1.1 302 Found
Date: Sat, 05 Feb 2011 21:14:13 GMT
Server: Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.6 with Suhosin-Patch
Location: http://myvhost.com/%d0%ba%d0%be%d0%bd%d1%82%d0%b0%d0%ba%d1%82%d1%8b
(.. to be continued ..)
С [NE]:
telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
GET //контакты HTTP/1.1
Host: myvhost.com
HTTP/1.1 302 Found
Date: Sat, 05 Feb 2011 21:12:39 GMT
Server: Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.6 with Suhosin-Patch
Location: http://myvhost.com/контакты
(.. to be continued ..)
Так что на стороне apache вы можете что-то сделать, но я не уверен, что это действительно полезно :-) большинство браузеров уже закодируют URL перед тем, как запустить apache. Например, это «тот же запрос» в apache access.log от моего клиента telnet и от firefox:
GET //\xd0\xba\xd0\xbe\xd0\xbd\xd1\x82\xd0\xb0\xd0\xba\xd1\x82\xd1\x8b HTTP/1.1
GET /%D0%BA%D0%BE%D0%BD%D1%82%D0%B0%D0%BA%D1%82%D1%8B HTTP/1.1