2009-08-22 4 views
1

У меня есть страница, которая перенаправляется из htaccess. теперь я могу передать немецкие символы как PARAMSпроблема кодирования символов htaccess

как

site.com/maörx/idasd

Options +FollowSymLinks 
RewriteEngine on 
RewriteRule ^([a-zA-Z0-9äÄöÖüÜéß\-]*)/?$ page.php?var=$1 [L] 

он работает в локальном хосте. но не на сервере .... сервер я получаю тот же старый вопрос (Ошибка 404: Объект не найден!)

является приведенный выше код является правильным для сервера ??

ответ

3

Это зависит от обоих кодировок символов (тот, который используется в файле .htaccess и тот, который используется для запрошенного URI), если ваше правило работает. Если оба они одинаковы, они должны работать.

Большинство пользовательских агентов в настоящее время используют либо ISO 8859-1, либо UTF-8 при кодировании URL-адреса для запроса по HTTP. Но UTF-8 рано или поздно заменит ISO 8859-1.

И как bobince заметил в комментариях, Apache использует внутреннюю однобайтную кодировку ASCII при интерпретации файлов .htaccess. Таким образом, у вас могут возникнуть проблемы при использовании многобайтовой кодировки, такой как UTF-8. Но это кодировка independed следующее:

# for ISO 8859-1 
RewriteRule ^([a-zA-Z0-9\xC4\xD6\xDC\xDF\xE4\xE9\xF6\xFC-]*)/?$ page.php?var=$1 [L] 
# for UTF-8 
RewriteRule ^(([a-zA-Z0-9-]|\xC3\x84|\xC3\x96|\xC3\x9C|\xC3\x9F|\xC3\xA4|\xC3\xA9|\xC3\xB6|\xC3\xBC)*)/?$ page.php?var=$1 [L] 

Но чтобы избежать такой конструкции, можно просто исключить слэш и точку и проверить значение позже с PHP:

RewriteRule ^([^/.]*)/?$ page.php?var=$1 [L] 
+0

, то почему его происходит только в сервере. .. i моя локальная машина работает .... :( – coderex

+0

Возможно, вы используете разные кодировки, как для файла, так и для URI. – Gumbo

+1

+1, Apache имеет дело с байтами, поэтому исходные правила будут работать только для Представления ISO-8859-1, которые являются редкими, поскольку URL-адреса сегодня являются де-факто UTF-8. Лучше избегать проблемы на этом уровне, разрешив любые старый символ; выполните любые проверки символов, которые вам понадобятся в PHP-скрипте, не имеет смысла вставлять такую ​​логику на уровне веб-сервера, как переписывать. – bobince

0

Если есть что-то особенное именно этих умляутов, вы должны использовать классы символов POSIX в качестве регулярного выражения, такие как [: альфа:], [: alphanum:] [: верхняя:] и [: ниже: ].

См., Например, POSIX character classes в статье в Википедии о регулярных выражениях.

Смежные вопросы