Я вижу post проверку utf-8 в правиле перезаписи htaccess, и я думаю, что это здорово, но более фундаментальная проблема, с которой я столкнулся в первую очередь:
Мне нужно было расширить, чтобы обрабатывать символы utf-8 для параметров строки запроса, имена каталогов, файлов и использоваться в дисплеях для пользователей и т.д.
Я настроил свой Apache с помощью utf-8 DefaultCharset, а также мой 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, он выкрикивает "США" и отлично работает.
Если я напишу ему URL-адрес, например http://mydomain.com/puzzle/Mexico, он ничего не говорит об этом и предупреждает меня, что индекс 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
Что я могу сделать, чтобы получить эти $% # [email protected](* # @!!! символы, но не косую черту, точку или другую не-альфу в мою программу, и как только там, будет ли она правильно декодировать их? posix char работают лучше? Есть ли что-то еще, что мне нужно настроить?