我有一个用例是在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。有没有人知道改进规则来处理这个角落的方法?
答案 0 :(得分:0)
我认为您必须对实际文件进行0字节的虚拟化,例如docker stop
,foo.ttl
等,并确保用foo.jsonld
声明了它们的类型,那么regular content negotiation就可以为AddType
工作。
但是,不是提供0字节的文件,而是为每个文件添加http://example.com/foo
等,以便将它们重定向到“真实”位置。相当冗长,是的,但是即使对于RewriteRule foo.ttl
和多种类型的复杂Accept
标头,也应该可以正常工作。