Apache htaccess 中的 RewriteCond规则介绍

分类: 服务器 > Linux
  1. apache 模块mod_rewrite提供一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每隔完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。此URL操作可以依赖于各种测试,比如服务器变量、环境变量、HTTP头、时间标记,甚至各种格式的用于匹配URL组成部分的查找数据库。

  2. RewriteCond 的规则以及参数说明:

    1. RewriteCond指令定义了规则生效的条件,即在一个RewriteRule指令之前可以有一个或多个RewriteCond指令。 条件之后的重写规则仅在当前URI与Pattern匹配并且满足此处的条件(TestString能够与CondPattern匹配)时才会起作用

    2. 说明:

      1. 【说明】定义重写发生的条件

      2. 【语法】RewriteCond TestString CondPattern [flags]

      3. 【作用域】server config, virtual host, directory, .htaccess

      4. 【覆盖项】FileInfo

      5. 【状态】 扩展(E)

      6. 【模块】mod_rewrite

    3. TestString 是一个纯文本的字符串,博阿含下列可扩展的成分:

      1. RewriteRule反向引用 ,引用方法是:$N (0 <= N <= 9)引用当前(带有若干RewriteRule指令的)RewriteCond中的与Pattern匹配的分组成分(圆括号!)。

      2. RewriteCond反向引用 ,引用方法是:%N (1 <= N <= 9)引用当前若干RewriteCond条件中最后符合的条件中的分组成分(圆括号!)。

      3. RewriteMap扩展 ,引用方法是:${mapname:key|default}

      4. 服务器变量 ,引用方法是:%{NAME_OF_VARIABLE} NAME_OF_VARIABLE

        1. HTTP头连接与请求:

          1. HTTP_USER_AGENT / HTTP_REFERER / HTTP_COOKIE / HTTP_FORWARDED / HTTP_HOST / HTTP_PROXY_CONNECTION / HTTP_ACCEPT

          2. REMOTE_ADDR / REMOTE_HOST / REMOTE_PORT / REMOTE_USER / REMOTE_IDENT

          3. REQUEST_METHOD / SCRIPT_FILENAME / PATH_INFO / QUERY_STRING / AUTH_TYPE

        2. 服务器自身

          1. DOCUMENT_ROOT / SERVER_ADMIN / SERVER_NAME / SERVER_ADDR / SERVER_PORT / SERVER_PROTOCOL / SERVER_SOFTWARE

        3. 日期和时间

          1. TIME_YEAR / TIME_MON / TIME_DAY / TIME_HOUR / TIME_MIN / TIME_SEC / TIME_WDAY / TIME

        4. 其他

          1. API_VERSION / THE_REQUEST / REQUET_URI / REQUEST_FILENAME / IS_SUBBEQ / HTTPS

      5. 其他主要事项:

        1. 特殊形式:%{ENV:variable} ,其中的variable可以是任意环境变量。 它是通过查找Apache内部结构或者(如果没找到的话)由Apache服务器进程通过getenv()得到的。

        2. 特殊形式:%{SSL:variable} ,其中的variable可以是一个SSL环境变量 的名字,无论mod_ssl 模块是否已经加载都可以使用(未加载时为空字符串)。 比如:%{SSL:SSL_CIPHER_USEKEYSIZE}将会被替换为128。

        3. 特殊形式:%{HTTP:header} ,其中的header可以是任意HTTP MIME头的名称。 它总是可以通过查找HTTP请求而得到。 比如:%{HTTP:Proxy-Connection}将被替换为Proxy-Connection:HTTP头的值。

    4. condPattern 是条件模式,即一个应用与当前TestString实例的正则表达式。TestString将被首先计算,然后再于CondPattern匹配

      1. 注意:CondPattern是一个perl兼容的正则表达式

      2. 可以在CondPattern串的开头使用’!'(惊叹号)来指定 不匹配

      3. CondPatterns有若干特殊的变种

        1. ‘>CondPattern ‘(词典顺序的大于):将CondPattern视为纯字符串,与TestString按词典顺序进行比较。 如果TestString大于CondPattern则为真。

        2. ‘=CondPattern ‘(词典顺序的等于):将CondPattern视为纯字符串,与TestString按词典顺序进行比较。 如果TestString等于CondPattern(两个字符串逐个字符地完全相等)则为真。 如果CondPattern是”"(两个双引号),则TestString将与空字符串进行比较。

        3. ‘-d ‘(目录):将TestString视为一个路径名并测试它是否为一个存在的目录。

        4. ‘-f ‘(常规文件):将TestString视为一个路径名并测试它是否为一个存在的常规文件。

        5. ‘-s ‘(非空的常规文件):将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。

        6. ‘-l ‘(符号连接):将TestString视为一个路径名并测试它是否为一个存在的符号连接。

        7. ‘-x ‘(可执行):将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。 该权限由操作系统检测。

        8. ‘-F ‘(对子请求存在的文件):检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。 它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!

        9. ‘-U ‘(对子请求存在的URL):检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。 它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!

        10. 注意: 所有这些测试都可以用惊叹号作前缀(‘!’)以实现测试条件的反转。

      4. 还可以在CondPattern之后追加特殊的标记[flags] 作为RewriteCond指令的第三个参数。flags是一个以逗号分隔的以下标记的列表:

        1. ‘nocase|NC ‘(忽略大小写)

        2. ‘ornext|OR ‘(或下一条件)

来源:原创 发布时间:2020-06-18 21:28:14