首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Apache上对RewriteCond使用"AND“、"OR”?

如何在Apache上对RewriteCond使用"AND“、"OR”?
EN

Stack Overflow用户
提问于 2009-05-28 18:11:24
回答 2查看 115.4K关注 0票数 123

对于Apache上的RewriteCond,这是AND,OR的用法吗?

代码语言:javascript
复制
rewritecond A [or]
rewritecond B
rewritecond C [or]
rewritecond D
RewriteRule ... something

变成了if ( (A or B) and (C or D) ) rewrite_it

所以看起来"OR“比"AND”具有更高的优先级?有没有一种方法可以很容易地辨别出来,就像(A or B) and (C or D)语法一样?

EN

回答 2

Stack Overflow用户

发布于 2015-07-23 03:11:47

这是一个有趣的问题,由于文档中没有非常明确地解释它,我将通过sourcecode of mod_rewrite来回答这个问题,演示开源的巨大好处。

在顶部部分,您将很快找到defines used to name these flags

代码语言:javascript
复制
#define CONDFLAG_NONE               1<<0
#define CONDFLAG_NOCASE             1<<1
#define CONDFLAG_NOTMATCH           1<<2
#define CONDFLAG_ORNEXT             1<<3
#define CONDFLAG_NOVARY             1<<4

搜索CONDFLAG_ORNEXT确认使用的是based on the existence of the [OR] flag

代码语言:javascript
复制
else if (   strcasecmp(key, "ornext") == 0
         || strcasecmp(key, "OR") == 0    ) {
    cfg->flags |= CONDFLAG_ORNEXT;
}

该标志的下一个出现是actual implementation,您将在其中找到遍历RewriteRule的所有RewriteConditions的循环,它主要做的是(剥离,为清楚起见添加注释):

代码语言:javascript
复制
# loop through all Conditions that precede this Rule
for (i = 0; i < rewriteconds->nelts; ++i) {
    rewritecond_entry *c = &conds[i];

    # execute the current Condition, see if it matches
    rc = apply_rewrite_cond(c, ctx);

    # does this Condition have an 'OR' flag?
    if (c->flags & CONDFLAG_ORNEXT) {
        if (!rc) {
            /* One condition is false, but another can be still true. */
            continue;
        }
        else {
            /* skip the rest of the chained OR conditions */
            while (   i < rewriteconds->nelts
                   && c->flags & CONDFLAG_ORNEXT) {
                c = &conds[++i];
            }
        }
    }
    else if (!rc) {
        return 0;
    }
}

您应该能够解释这一点;这意味着OR具有更高的优先级,并且您的示例确实导致了if ( (A OR B) AND (C OR D) )。例如,如果你有以下条件:

代码语言:javascript
复制
RewriteCond A [or]
RewriteCond B [or]
RewriteCond C
RewriteCond D

它将被解释为if ( (A OR B OR C) and D )

票数 131
EN

Stack Overflow用户

发布于 2019-10-14 00:19:13

经过许多努力,为了实现一个通用的、灵活的、可读性更好的解决方案,在我的例子中,我最终将OR的结果保存到ENV变量中,并对这些变量执行

代码语言:javascript
复制
# RESULT_ONE = A OR B
RewriteRule ^ - [E=RESULT_ONE:False]
RewriteCond ...A... [OR]
RewriteCond ...B...
RewriteRule ^ - [E=RESULT_ONE:True]

# RESULT_TWO = C OR D
RewriteRule ^ - [E=RESULT_TWO:False]
RewriteCond ...C... [OR]
RewriteCond ...D...
RewriteRule ^ - [E=RESULT_TWO:True]

# if ( RESULT_ONE AND RESULT_TWO ) then ( RewriteRule ...something... )
RewriteCond %{ENV:RESULT_ONE} =True
RewriteCond %{ENV:RESULT_TWO} =True
RewriteRule ...something...

需求

支持

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/922399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档