一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Apache RewriteCond 否定条件如何写

时间:2026-08-08 13:41:26 编辑:袖梨 来源:一聚教程网

RewriteCond 的否定通过在条件值前加 ! 实现,表示“不匹配该条件”,如 !^www.example.com$;! 紧贴条件值无空格,不作用于标志,可与其他条件组合使用。

RewriteCond 的否定条件,是通过在条件字符串前加 !(英文感叹号)来实现的,表示“不匹配该条件”。

比如你想让规则在某个条件下生效,就在对应条件值前面加 !


基本写法:在条件值前加 !

RewriteCond %{HTTP_HOST} !^www.example.com$

这表示:当 Host 不等于 www.example.com,后续的 RewriteRule 才会执行。

注意:

  1. ! 紧贴在条件值前面,中间不能有空格
  2. 正则表达式本身仍需按规则转义(如点号 . 要写成 .);
  3. ! 否定的是整个匹配表达式的结果,不是正则语法的一部分。

常见否定场景示例

  1. 排除某个域名

    RewriteCond %{HTTP_HOST} !^(www.)?example.com$RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

    → 把所有非 example.comwww.example.com 的域名都跳转过去。

  2. 排除特定路径(如静态资源)

    RewriteCond %{REQUEST_URI} !^/(css|js|images)/RewriteRule ^(.*)$ /index.php [L]

    → 所有不以 /css//js//images/ 开头的请求才走 PHP 入口。

  3. 排除某个查询参数

    RewriteCond %{QUERY_STRING} !^debug=1$RewriteRule ^api/ - [F]

    → 当查询字符串不是 debug=1 时,禁止访问 /api/


注意:不要在标志里加 !

RewriteCond 的标志(如 [NC][OR]不支持 ! 否定

否定只作用于匹配字符串本身。如果需要逻辑“非”,必须写在条件值前,而不是标志里。

错误写法 ❌:

RewriteCond %{REQUEST_FILENAME} -f [!NC]# 无效!标志里不能加 !

正确思路 ✅:用 ! 否定整个条件,或改用其他判断逻辑(例如用 -f 判断存在,再配合 ! 表示“不存在”):

RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ index.php [L]

→ 文件和目录都不存在时,才重写到 index.php


多个条件的否定组合

[OR] 或默认的 AND 逻辑时,每个 RewriteCond 可独立加 !

RewriteCond %{HTTP_USER_AGENT} !GooglebotRewriteCond %{HTTP_USER_AGENT} !BingbotRewriteRule ^robots.txt$ /custom-robots.txt [L]

→ 排除 Google 和 Bing 的爬虫,其他访问才返回自定义 robots.txt。

若想“只要不是这两个之一就触发”,也可用 [OR] + ! 组合,但要注意逻辑是否符合预期。

不复杂但容易忽略

热门栏目