URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 6971
[ Назад ]

Исходное сообщение
"Apache, mod_rewrite"

Отправлено Reaper , 01-Сен-10 01:45 
Помогите настроить mod_rewrite для подмены типа документа в определённых случаях.

Преамбула.

На сайте используется xhtml и содержимое хранится в файлах .xhtml, также есть в наличии многоязыковая поддержка основанная на использовании mod_rewrite. mod_rewrite был использован для последнего из следующих соображений:

хотелось:

а) отсутствия в урлах языка: /en/
б) отсутствия в урлах параметра с языком: ?lang=en
в) неиспользования серверных скриптов

Некоторые особенности:

.xhtml имеет mime-тип application/xhtml+xml, IE 6,7,8 не понимают этот mime-тип, поэтому если тип документа xhtml не загоняют внутрь .html файлов, используют mod_rewrite для подмены mime-типа для браузеров не умеющих application/html+xml.

Код подмены (работающий), .htaccess:

RewriteCond %{REQUEST_URI} \.xhtml$
RewriteCond %{HTTP_USER_AGENT} MSIE [OR]
RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml\s*;\s*q=0\.?0*(\s|,|$)
RewriteRule .* - [T=text/html]

теперь правила для многоязыковой поддержки, .htaccess:

RewriteBase /

# это переключатель локали. устанавливаем куки,
# обнуляем lang параметр во избежание зацикливания
RewriteCond %{QUERY_STRING} lang=(en|fr|de)
RewriteRule .* $0? [CO=lang:%1:%{HTTP_HOST},R,L]

# если куки установлен идём в локальную субдиректорию
RewriteCond %{HTTP_COOKIE} lang=(de|fr|en)
RewriteRule .* %1/$0 [L]

# если нет - смотрим язык пользователя
RewriteCond %{HTTP:Accept-Language} ^(en|fr|de).*$
RewriteRule .* %1/$0 [L]

# наконец если ничего не сработало -
# устанавливаем дефолтную локаль
RewriteRule .* fr/$0 [L]

# иначе при редиректе новая локаль сразу не видна
ExpiresActive On
ExpiresDefault "access plus 0 seconds"


По отдельности оно всё работает, а если вместе, то перестаёт работать подмена типа документа. Полный .htaccess: http://pastebin.com/3MpgfCne

Лог mod_rewrite при заходе  IE6 на epicats.com/index.xhtml : http://pastebin.com/U7GZxyH3 - как видно из лога последняя строка 21, после неё IE выкидывает диалог сохранения непонятного ему документа, т.е. получает не text/html.


Содержание

Сообщения в этом обсуждении
"Apache, mod_rewrite"
Отправлено Reaper , 01-Сен-10 02:11 
add: в строке 14 лога mod_rewrite сработало условие провери языка браузера. Плюс, не написал содержимое .htaccess в языковых директориях (/en/|/fr/|/de/), вот оно:

RewriteEngine Off

Перенос части подменяющей mime-тип в .htaccess в языковых директориях ничего не даёт, там всё заканчивается на строке 20 лога в этом случае.


"Apache, mod_rewrite"
Отправлено Reaper , 03-Сен-10 18:32 
up