使用mod_rewrite / RewriteCond规则进行内容协商

时间:2015-02-26 14:38:46

标签: apache mod-rewrite github-pages content-negotiation linked-data

我有一个用例是在Github页面中托管a set of files(具有不同序列化格式的相同RDF内容,如RDF / XML,Turtle和JSON-LD),并使用a w3id URL作为永久性标识符。

此外,我希望对该永久URL进行内容协商。如果我在Apache服务器上托管我的文件,这将是微不足道的,但遗憾的是Github页面不支持内容协商。所以我试图通过URL重写规则来确定我可以在多大程度上做到这一点。

所以这个想法类似于以下内容。

GET http://w3id.org/foo  -- redirect to --> http://foo.git.io/content.ttl
Accept: text/turtle

GET http://w3id.org/foo  -- redirect to --> http://foo.git.io/content.jsonld
Accept: application/ld+json

目前,我的规则如下所示。

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_ACCEPT} ^.*application/rdf\+xml.* 
RewriteRule ^foaf$ http://nandana.github.io/foaf/card.rdf [R=303,L]
RewriteCond %{HTTP_ACCEPT} ^.*text/turtle.* 
RewriteRule ^foaf$ http://nandana.github.io/foaf/card.ttl [R=303,L]
RewriteCond %{HTTP_ACCEPT} ^.*application/ld\+json.* 
RewriteRule ^foaf$ http://nandana.github.io/foaf/card.jsonld [R=303,L]
RewriteRule ^foaf$ http://nandana.github.io/foaf/card.html [R=303,L]

虽然这适用于大多数情况,但它会因某些极端情况而中断。例如,如果有一个接受标头,如下所示

Accept: application/rdf+xml;q=0.9,text/turtle

这将返回application / rdf + xml(因为第一个规则匹配)但是根据内容协商它应该返回turtle。有没有人知道改进规则来处理这个角落的方法?

1 个答案:

答案 0 :(得分:0)

我认为您必须对实际文件进行0字节的虚拟化,例如docker stopfoo.ttl等,并确保用foo.jsonld声明了它们的类型,那么regular content negotiation就可以为AddType工作。

但是,不是提供0字节的文件,而是为每个文件添加http://example.com/foo等,以便将它们重定向到“真实”位置。相当冗长,是的,但是即使对于RewriteRule foo.ttl和多种类型的复杂Accept标头,也应该可以正常工作。