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

5
我有一个使用场景,需要在Github页面上托管一组文件(具有不同序列化格式的相同RDF内容,例如RDF / XML,Turtle和JSON-LD),并使用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。有人知道如何改进规则以处理这种情况吗?

类似的问题:Mod-Rewrite内容协商混合Accept标头?(在[webmasters.se]上)和根据首选语言(Accept-Language)重定向.htaccess(在[sf]上)。 - unor
感谢 @unor 的指点!显然对于这个问题没有解决方案,是吗? - Nandana
我没有找到一个解决方案,但我仍然希望有一种某种方式(不需要服务器端脚本)可以实现。 - unor
1个回答

0

我认为您需要制作实际文件的0字节虚拟文件,例如foo.ttlfoo.jsonld等,并确保它们的类型已经声明了AddType,然后常规内容协商可以用于http://example.com/foo

但是,不要提供0字节文件,而是为每个文件设置RewriteRule foo.ttl等,以便将它们重定向到“真实”位置。 是相当冗长的,但应该可以正确处理具有q = 和多种类型的复杂Accept标头。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接