Xpoint
   [напомнить пароль]

Как отдавать XHTML?

2004-04-23 14:02:40 [обр] Владимир Палант [досье]

Опять задумался над этим вопросом, в частности из-за XHTML -- отложить лет на 10?. Задача такая: имеется статичный XHTML-файл. При запросе нужно проверить, содержит ли HTTP_ACCEPT строку application/xhtml+xml. Если да, то Content-Type должен быть application/xhtml+xml, иначе text/html (чтобы IE & Co. тоже поняли). Я пока что нашёл только одно решение:

AddType application/xhtml+xml xhtml
AddType text/html xhtml_compat

RewriteEngine on
RewriteCond %{HTTP_ACCEPT} !application/xhtml\+xml
RewriteRule (.*)\.xhtml$ $1.xhtml_compat

Работает при условии, что на файловой системе есть ссылка file.xhtml_compat, которая указывает на file.xhtml. Это, конечно же, криво. Есть ли идеи получше?

PS: Если у кого-нибудь возникают вопросы, зачем вообще использовать application/xhtml+xml вместо того, чтобы всегда посылать файл как text/html, читайте Sending XHTML as text/html Considered Harmful.

спустя 42 минуты [обр] Владимир Палант [досье]

Оказывается RTFM:

AddType application/xhtml+xml xhtml

RewriteEngine on
RewriteCond %{HTTP_ACCEPT} !application/xhtml\+xml
RewriteRule (.*)\.xhtml$ - [T=text/html]

В принципе, на этом тему можно закрывать...

спустя 15 часов [обр] Владимир Палант [досье]

Одна небольшая поправка, чтобы проверка была более корректной. Если браузер указывает пониженный приоритет для application/xhtml+xml (что должна была бы к примеру сделать Opera 7.2x, которая не поддерживает скрипты в XHTML), то использовать его в этом случае тоже не нужно:

AddType application/xhtml+xml xhtml

RewriteEngine on
RewriteCond %{HTTP_ACCEPT} !application/xhtml\+xml [OR]
RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml\s*;\s*q=0
RewriteRule (.*)\.xhtml$ - [T=text/html]

Случайно нашел в Mit dem Apache XHTML-Seiten ausliefern (весьма неплохая статья, но, к сожалению, на немецком).

спустя 7 часов [обр] Владимир Палант [досье]
Кстати, ещё одно интересное замечание из этой статьи — не мешало бы для таких страниц отдавать заголовок "Vary: Accept", чтобы прокси знал, когда запрашивать страницу ещё раз. В статье application/xhtml+xml даже не выдаётся при запросах HTTP/1.0, поскольку Vary в этом стандарте нет. Однако Google выдаёт фразы типа таких: "IE4 to 6 never fixed the Vary header
bug, which makes all sites using Russian Apache (Vary: accept-charset,
user-agent) not cacheable in IE." Так что целесообразность этого заголовка сомнительна (делать предлагаемую проверку USER_AGENT я не хочу).
Powered by POEM™ Engine Copyright © 2002-2005