Je suis en train de configurer un mécanisme de négociation de contenu léger à l'aide de Mod-Rewrite d'Apaches. La configuration doit fournir plusieurs représentations de données différentes (par exemple, HTML, XML, RDF/XML et RSS, bien que je doive en considérer un peu plus dans mon application) sur une URL de ressource de base en fonction de l'en-tête Accept de la demande:
# serve html on base url if requested via accept header
RewriteCond %{HTTP_ACCEPT} text/html [OR]
RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml
RewriteRule ^resource/(.*)$ view/html/$1.html [NC,R=303,L]
# serve xml on base url if requested via accept header
RewriteCond %{HTTP_ACCEPT} application/xml
RewriteRule ^resource/(.*)$ view/xml/$1.xml [NC,R=303,L]
# serve rdf on base url if requested via accept header
RewriteCond %{HTTP_ACCEPT} application/rdf\+xml
RewriteRule ^resource/(.*)$ view/rdf/$1.rdf [NC,R=303,L]
# serve rss on base url if requested via accept header
RewriteCond %{HTTP_ACCEPT} application/rss\+xml
RewriteRule ^resource/(.*)$ view/rss/$1.rss [NC,R=303,L]
# serve html as default response (keep at bottom)
RewriteRule ^resource/(.*)$ view/html/$1.html [NC,R=303,L]
Cela fonctionne très bien si la requête envoie des en-têtes Accepter purs, mais je rencontre des problèmes lorsque des en-têtes Accepter mixés sont envoyés. Dans ce cas, ma configuration ne respecte aucune valeur q donnée dans l'en-tête et je finis par servir le premier type de contenu correspondant en fonction de l'ordre (arbitraire) de mes RewriteRules. Par exemple, je sers de manière incorrecte text/html pour la requête suivante:
Accept: application/rdf+xml;q=0.5,text/html;q=.3
Existe-t-il un moyen de faire en sorte que ma configuration prenne en compte les valeurs q de l'en-tête Accept? Toute aide est appréciée.
Utilisez la fonctionnalité de négociation de contenu intégrée avec un type map . Vous devrez peut-être modifier vos noms de fichier/URL ou utiliser des règles de réécriture après l'application de la table de types.