当 Apachemod_dir
的DirectorySlash
机制 301 请求映射到目录但缺少尾部斜杠时,它会生成类型的响应正文text/html
,无论Accept:
请求的标头如何。虽然我知道几乎每个客户端都会使用Location:
响应中的标头来确定去哪里,但我想知道是否可以自定义响应主体以生成text/html
. 在我的具体情况下,我正在获取application/rdf+xml
或text/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
s 彼此隔离的指令。
那么有没有办法对错误响应主体进行内容协商?