Я вижу сообщение , проверяющее utf-8 в правиле перезаписи htaccess , и я думаю, что это здорово, но у меня возникла более фундаментальная проблема:
Мне нужно было расширить для обработки символов utf-8 для параметров строки запроса, имен каталогов, файлов и используемых в дисплеях для пользователей и т. Д.
Я настроил свой Apache с DefaultCharset utf-8, а также с моим php, если это имеет значение. Мое оригинальное правило перезаписи отфильтровывало все, кроме обычного A-Za-z, подчеркивания и дефиса. и это сработало. Что-нибудь еще даст вам 404 (это то, что я хочу!) Теперь, однако, кажется, что все совпадает, включая вещи, которые я не хочу, однако, хотя кажется, что они совпадают, они не попадают в строку запроса, если только обычная строка символов A-Za-z_-
Я нахожу это непонятным, потому что правило гласит: поместите в строку запроса все, что вам подходит:
Вот оригинальное правило:
RewriteRule ^/puzzle/([A-Za-z_-]+)$ /puzzle.php?g=$1 [NC]
и вот пересмотренное правило:
RewriteRule ^/puzzle/(\w+)$ /puzzle.php?g=$1 [NC]
Я внес изменение, потому что где-то я прочитал, что \ w соответствует ВСЕМ альфа-символам, где A-Zetc. только соответствует без акцентов и прочее.
Кажется, не имеет значения, какое из этих правил я использую: Вот что происходит:
В приложении у меня есть это:
echo $_GET['g'];
Если я передаю URL, например, http://mydomain.com/puzzle/USA, он повторяет "USA" и работает нормально.
Если я передаю ему URL-адрес типа http://mydomain.com/puzzle/México, он ничего не говорит об этом и предупреждает, что индекс g не определен и, конечно, не получает ресурсы для Мексики.
если я передаю ему URL-адрес типа http://mydomain.com/puzzle/fuzzle/buzzle/j.qle, он делает то же самое.
Этот последний случай должен быть 404!
И делает это независимо от того, какое из приведенных выше правил я использую. Я настроил переписать журнал
RewriteLogLevel 5
RewriteLog /opt/local/apache2/logs/puzzles.httpd.rewrite
но оно пустое.
Вот из журнала обычного доступа (он дает статус 200)
[26/May/2010:11:21:42 -0700] "GET /puzzle/M%C3%A9xico HTTP/1.1" 200 342
[26/May/2010:11:21:54 -0700] "GET /puzzle/M/l.foo HTTP/1.1" 200 342
Что я могу сделать, чтобы получить эти символы $% # $ @ (* # @ !!!, но не косую черту, точку или другой не-альфа в мою программу, и когда она там будет, она будет правильно их декодировать ??? Классы posix char работают лучше? Мне нужно что-то еще настроить?