Почему Apache .htaccess переписывает URL-адрес нелатинских символов в urlencoded?Как это решить? - PullRequest
1 голос
/ 03 февраля 2011

Почему Apache .htaccess переписывает URL-адрес нелатинского символа в urlencoded? Как это решить?

domain.com//контакты возвращает domain.com/%25d0%25ba%25d0%25be%25d0%25bd%25d1%2582%25d0%25b0%25d0%25ba%25d1%2582%25d1%258b

domain.com/контакты// возвращает domain.com/%2525d0%2525ba%2525d0%2525be%2525d0%2525bd%2525d1%252582%2525d0%2525b0%2525d0%2525ba%2525d1%252582%2525d1%25258b/

RewriteEngine On
# Rewrite multiple slashes with single slash after domain
RewriteCond %{THE_REQUEST} ^[A-Z]+\s//+(.*)\sHTTP/[0-9.]+$ [OR]
RewriteCond %{THE_REQUEST} ^[A-Z]+\s(.*/)/+\sHTTP/[0-9.]+$
RewriteRule .* http://%{HTTP_HOST}/%1 [R=301,L]
# Rewrite multiple slashes with single slash in URL
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]

Ответы [ 2 ]

4 голосов
/ 06 февраля 2011

Ну, я в основном согласен с @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
0 голосов
/ 03 февраля 2011

http://en.wikipedia.org/wiki/Percent-encoding

Вот почему. И вы не можете изменить это поведение.

...