我怎样才能否定Apache RewriteCond中的条件

时间:2013-02-10 20:38:08

标签: apache mod-rewrite

我想将.xhtml文件作为

提供
  • application/xhtml+xml如果浏览器说它接受了它。
  • text/html否则

然后,我有这段代码:

AddType text/html .xhtml
<Files "*.xhtml">
    RewriteEngine on
    RewriteCond "%{HTTP:Accept}" "application/xhtml\+xml\s*(?:,|$)"
    RewriteRule .* - [T=application/xhtml\+xml]
</Files>

它有效。 但我认为可以简化否定条件。像

这样的东西
<Files "*.xhtml">
    RewriteEngine on
    RewriteCond "%{HTTP:Accept}" !"application/xhtml\+xml\s*(?:,|$)"
    RewriteRule .* - [T=text/html]
</Files>

但它不起作用:即使支持XHTML,我总是会收到text/html页面。

1 个答案:

答案 0 :(得分:2)

我猜第二个选项应该是这样的:

<Files "*.xhtml">
    RewriteEngine on
    RewriteCond %{HTTP:Accept} !application/xhtml\+xml 
    RewriteRule .* - [T=text/html]
</Files>

这样,如果HTTP:Accept变量不包含字符串application/xhtml+xml,则MIME类型设置为text/html

回答OP评论:

问题中的正则表达式: application/xhtml\+xml\s*(?:,|$)

  • application/xhtml =按字面意思匹配字符 application / xhtml

  • \+ =从字面上匹配字符 +

  • xml =按字面意思匹配字符 xml

  • \s* =在application/xhtml+xml之后,在零和无限次之间匹配空格字符(空格,制表符,换行符等),多次尽可能根据需要回馈(贪婪)。

  • ?: =问号()和冒号()表示此组(圆括号内)不是返回参考。

  • ,|$ =在字符串末尾匹配字符,字面 OR 断言位置。

此答案中的正则表达式:

仅包含相关的字符串细分: application / xhtml + xml 以确保匹配,因此当此字符串存在时,不会应用该规则。