Apache DirectorySlash 301具有自定义,内容协商的响应主体

时间:2014-07-02 13:18:09

标签: apache .htaccess redirect errordocument content-negotiation

当Apache mod_dir DirectorySlash机制301发出映射到目录但缺少其尾部斜杠的请求时,它会生成类型为text/html的响应主体,无论请求的Accept:标头。虽然我知道几乎每个客户都会在响应中使用Location:标题来确定去哪里,但我想知道是否可以自定义响应主体以生成其他内容比text/html。在我的具体情况下,我收到application/rdf+xmltext/turtle请求并返回类似编码的RDF响应。我希望能够通过以下响应处理这些丢失的斜杠301:

@prefix owl: <http://www.w3.org/2002/07/owl#>.
@base <http://www.example.com/>.

<resource> owl:sameAs <resource/>.

我已尝试在ErrorDocument文件中使用重写规则和.htaccess,如下所示:

DirectorySlash off

RewriteEngine on
RewriteOptions AllowNoSlash

# When no trailing slash, redirect to slashed path with a special ttl response body
ErrorDocument 301 /resource-see-other.ttl
RewriteCond %{HTTP:Accept} text/turtle
RewriteCond %{REQUEST_URI} ^/resource$
RewriteRule .* /resource/ [L,R=301]

# When text/turtle request with trailing slash, return resource
RewriteCond %{HTTP:Accept} text/turtle
RewriteCond %{REQUEST_URI} ^/resource/$
RewriteRule .* index.ttl [L]

这很好用。但是一旦我需要处理其他内容类型的案例,它就会停止工作。虽然我可以毫无问题地添加另一组重写规则,但我不能在ErrorDocument文件中重复.htaccess指令;只有文件中最后一个这样的指令才会实际应用,导致所有301个响应都获得相同的响应体。

我想如果我不被.htaccess限制,我可以使用<Location>指令将ErrorDocument彼此隔离开来。

那么有没有办法在错误响应机构上进行内容协商?

0 个答案:

没有答案