web-dev-qa-db-ja.com

混合AcceptヘッダーのMod-Rewriteコンテンツネゴシエーション?

ApacheのMod-Rewriteを使用して、軽量のコンテンツネゴシエーションメカニズムを構成しています。構成は、要求のAcceptヘッダーに応じて、ベースリソースURLでいくつかの異なるデータ表現(たとえば、HTML、XML、RDF/XML、RSSなど、実際にはアプリケーションでさらに検討する必要があります)を提供する必要があります。

# 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]

要求が純粋なAcceptヘッダーを送信している場合、これは非常にうまく機能しますが、Acceptヘッダーが混在して送信されると問題が発生します。その場合、私の構成はヘッダー内の特定のq値を尊重せず、RewriteRulesの(任意の)順序に従って最初に一致するコンテンツタイプを提供することになります。たとえば、次のリクエストに対して誤ってtext/htmlを提供しています:

Accept: application/rdf+xml;q=0.5,text/html;q=.3

Acceptヘッダーのq値を考慮に入れて構成する方法はありますか?どんな助けも大歓迎です。

4
MRA

type map で組み込みのコンテンツネゴシエーション機能を使用します。型マップを適用して、ファイル名/ URLを微調整するか、書き換えルールafterを使用する必要がある場合があります。

2
symcbean