8792 sujets

Développement web côté serveur, CMS

Bonsoir,

J'ai un contenu que je dois présenter en application/xhtml+xml. Je souhaitais néanmoins délivrer du text/html pour IE, et traiter cette condition dans la configuration apache.
Je pensais :
1/ prélever l'information avec une variable d'environnement (mod_setenvif)
2/ utiliser la variable d'environnement pour spécifier le content-type dans le header http (mod_header).
Ce schéma fonctionne en général (pour un header perso) mais pas pour content-type. Je suppose que la propriété est surchargée par mod_mime ? Quoi qu'il en soit je ne parviens finalement pas à positionner content-type en fonction du navigateur.

Quelqu'un aurait-il une idée ?
Salut,


$accept_xml = !empty($_SERVER['HTTP_ACCEPT']) && strpos($_SERVER['HTTP_ACCEPT'], "application/xhtml+xml") !== false ;
if($accept_xml)
{
	header("Content-Type: application/xhtml+xml; charset=iso-8859-15") ;
	echo "<?xml version=\"1.0\" encoding=\"ISO-8859-15\"?>\n" ;
	echo "<?xml-stylesheet type=\"text/css\" href=\"".ROOT."/style.css\" ?>\n" ;
}

else { header("Content-Type: text/html; charset=iso-8859-15") ; }



if($accept_xml) { echo "		<meta http-equiv=\"Content-Type\" content=\"application/xhtml+xml; charset=iso-8859-15\" />\n" ; }
else { echo "		<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-15\" />\n" ; }


Je te fais confiance pour faire le tri la dedans Smiley langue , j'ai fait un basique copié/collé de ce que j'avais fait pour un site.
Modifié par Olivier (21 Jul 2005 - 22:32)
@ Raphael> Tu tiens vraiment bien le multitâches ! Smiley lol
J'ai effectivement tiré une piste sérieuse de ton lien : mod_rewrite, cela ne va pas simplifier mes affaires, mais il faut savoir un peu souffrir pour xhtml... Smiley langue


@ Olivier> je souhaitais une solution à base de configuration apache, et non pas du php de base. Smiley cligne
Je viens de terminer mes premiers tests à partir des indications fournis par la-grange. Je ne connaissais pas la possibilité de forcer le content-type avec le module rewrite, cela me semble pas mal en définitive.

Voici le code donné par Karl :
(1) AddType  application/xhtml+xml html
   
(2) RewriteEngine On
(3) RewriteBase /
(4) RewriteCond %{HTTP_ACCEPT} !application/xhtml\+xml
(5) RewriteCond %{HTTP_ACCEPT} (text/html|\*/\*)
(6) RewriteCond %{REQUEST_FILENAME} .*\.html
(7) RewriteRule ^.*$ - "[T=text/html,L]"

Pour ceux qui ont des facilités dans la langue de Goethe, l'article source se trouve là : http://schneegans.de/tips/apache-xhtml/
Voici quelques explications :
- ligne 1 : tous les documents en .html sont servis en application/xhtml+xml (impose la présence du module mod_mime)
- ligne 2 : utilisation de l'url rewriting (impose la présence du module mod_rewrite)
- ligne 3 : on force base = racine du site. Impact uniquement si ce code est dans un .htaccess logé dans un sous répertoire
- ligne 4 : première condition le navigateur n'accepte pas application/xhtml+xml explicitement
- ligne 5 : deuxième condition le navigateur accepte text/html|*/* explicitement
- ligne 6 : le document requis est un .html
- ligne 7 : lorsque les conditions au dessus sont toutes remplies, "rewriting" de l'url sans aucune modification, mais en forçant le content-type à text/html

En fait d'après mon analyse la ligne 3 est sans effet dans ce contexte puisque l'url n'est pas utilisée en dehors de l'extension du document. La ligne 5 pose une condition spécifique à IE (à vérifier car mon allemand est très limité). De toute façon même si c'est un peu frileux, je préfère limiter l'envoi du application/xhtml+xml aux navigateurs qui l'acceptent explicitement. Je suis donc parti pour utiliser le code suivant :
AddType  application/xhtml+xml html
#
RewriteEngine On
RewriteCond %{HTTP_ACCEPT} !application/xhtml\+xml
RewriteCond %{REQUEST_FILENAME} .*\.html
RewriteRule ^.*$ - "[T=text/html,L]"

Il faut être attentif à 2 choses :
- adapter ces lignes à l'extension réelle des documents (htm, php ...)
- le [...,L] n'est pas forcement adapté si vous utilisez d'autres règles d'url rewriting.

@ Marvin Le Rouge> J'avais déjà implémenté d'autres règles mod_rewrite, et j'avais la crainte d'une certaine incompatibilité. Je n'ai pas terminer mes tests, mais je ne crois pas finalement connaître de problème.
Modifié par Xavier (22 Jul 2005 - 10:59)
Dans un souci de portabilité tu ne ferais pas mieux d'utiliser le code donné par Olivier?
solo a écrit :
Dans un souci de portabilité tu ne ferais pas mieux d'utiliser le code donné par Olivier?
J'ai beau me creuser, je ne vois pas comment tu conçois cet argument.
A partir du moment ou tu maîtrises ton serveur web, gérer le type MIME à ce niveau me parait au contraire bien plus générique. Ainsi tu te rends indépendant de la plate-forme applicative :
- pas de php
- php maison
- CMS php
- autre CMS
- J2EE
- autre...
Autant pour moi je partait sur le principe que tu voulais mettre en place une appli PHP. Dans ce cas là, pour que cette appli tourne sous n'importe quel plateforme et n'importe quel serveur web il aurait fallut faire la manip à l'aide de header().
Mise à jour.

Les fragments de configuration que je donnais il y a quelques mois restent valables et opérationnels, mais pour ceux qui aujourd'hui auraient un problème similaire, je conseillerais de creuser une nouvelle piste susceptible de conduire à une meilleure architecture :
La version 2.2 d'apache introduit un nouveau module, mod_filter qui devrait (spéculation, en l'absence de tests de ma part) permettre de traiter la question de manière plus générique.