【问题标题】:How can I negate a condition in Apache RewriteCond如何否定 Apache RewriteCond 中的条件
【发布时间】:2013-02-18 08:46:29
【问题描述】:

我想将 .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>

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

【问题讨论】:

  • ! 应该可以像您拥有它一样否定它。这不是你得到的结果吗?
  • @MichaelBerkowski 不,即使支持 XHTML,我也会得到一个 text/html 页面
  • 也许你已经从例如mime.types,所以跳过 T=text/html 是没有用的。
  • @covener 不,.xhtml 的默认 MIME 类型是 application/xhtml+xml

标签: apache mod-rewrite


【解决方案1】:

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

<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 之后的空白字符(空格、制表符、换行符等),在零次和无限次之间,尽可能多次,根据需要返回(贪婪)。

  • ?: = 问号 (?) 和冒号 (:) 表示该组(在圆括号内)不是反向引用。 p>

  • ,|$ = 匹配字符 , 字面意思是 OR 断言字符串末尾的位置。

此答案中的正则表达式:

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

【讨论】:

  • 谢谢,它有效!但是\s*(?:,|$) 到底做了什么?如果我想否定条件,为什么必须删除它?
  • 但我不明白为什么%{HTTP:Accept} 总是匹配!"application/xhtml\+xml\s*(?:,|$)"。比如浏览器发送Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,那么%{HTTP:Accept}匹配"application/xhtml\+xml\s*(?:,|$)",但我认为不应该匹配!"application/xhtml\+xml\s*(?:,|$)"
  • 我不确定我是否理解您不理解的内容,但让我们看看:您说but I think it shouldn't match !"application/xhtml\+xml\s*(?:,|$)" 它没有,满足条件要求(NOT),这就是为什么规则总是应用,即使application/xhtml+xml 存在,据我所知,这是问题所在。将正则表达式字符串减少到相关段:application/xhtml+xml 确保在该字符串存在时不应用规则。
  • 也许我可以通过 JavaScript 示例更好地解释我的疑问:jsfiddle.net/BMT63
  • @Oriol 是一样的。当正则表达式与传入字符串的模式不匹配时,满足 NOT 条件,因为它不同(本例)或仅仅因为字符串不存在。您的条件 RewriteCond "%{HTTP:Accept}" !"application/xhtml\+xml\s*(?:,|$)" 是说:如果此正则表达式 application/xhtml\+xml\s*(?:,|$) 与 Accept 变量不匹配,则应用该规则。好吧,这个正则表达式永远不会匹配 Accept 变量,即使字符串 application/xhtml+xml 确实存在,所以总是应用该规则。
猜你喜欢
  • 2016-04-27
  • 2013-07-17
  • 1970-01-01
  • 2022-10-15
  • 2020-05-07
  • 2014-05-26
  • 2011-08-04
  • 1970-01-01
  • 2020-07-21
相关资源
最近更新 更多