অ্যাপাচে রিভারাইটকন্ডের জন্য কীভাবে "এবং", "বা" ব্যবহার করবেন?


115

এটি কীভাবে এ্যাপা, বা ওপাশের জন্য ব্যবহার করবেন RewriteCond?

rewritecond A [or]
rewritecond B
rewritecond C [or]
rewritecond D
RewriteRule ... something

হয়ে if ( (A or B) and (C or D) ) rewrite_it

সুতরাং দেখে মনে হচ্ছে "ও" এর চেয়ে "ও" এর চেয়ে বেশি অগ্রাধিকার? (A or B) and (C or D)সিনট্যাক্সের মতো সহজেই বলার উপায় আছে কি ?


1
হ্যাঁ সঠিক. [OR] হ'ল (অন্তর্ভুক্ত) "এবং" এর চেয়ে বেশি অগ্রাধিকার। সম্মিলিত শর্তটি প্রকৃতপক্ষে ((এ বা বি) এবং (সি বা ডি))।
Doin থেকে

2
আপনি এই বিবরণটি ckolilers.org/apache-rewrite-htaccess.html#precedence সহায়ক হিসাবে খুঁজে পেতে পারেন ।
চক কলার্স 21

উত্তর:


118

এটি একটি আকর্ষণীয় প্রশ্ন এবং যেহেতু ডকুমেন্টেশনে এটি খুব স্পষ্টভাবে ব্যাখ্যা করা হয়নি তবে আমি মোড_উরাইটের উত্সকোডটি দিয়ে এই উত্তর দেব ; মুক্ত-উত্সের একটি বড় সুবিধা প্রদর্শন করে

উপরের অংশে আপনি এই পতাকাগুলির নাম দেওয়ার জন্য ব্যবহৃত সংজ্ঞাগুলি দ্রুত খুঁজে পাবেন :

#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 অনুসন্ধান করে নিশ্চিত করে যে এটি [OR] পতাকার অস্তিত্বের ভিত্তিতে ব্যবহৃত হয়েছিল :

else if (   strcasecmp(key, "ornext") == 0
         || strcasecmp(key, "OR") == 0    ) {
    cfg->flags |= CONDFLAG_ORNEXT;
}

পতাকাটির পরবর্তী ঘটনাটি হ'ল প্রকৃত বাস্তবায়ন যেখানে আপনি একটি পুনর্লিখনক নিয়মের সমস্ত পুনর্লিখনকন্ডিশনের মধ্য দিয়ে যায় এমন লুপটি খুঁজে পাবেন এবং এটি মূলত যা করে তা হ'ল (স্ট্রিপ, মন্তব্য স্পষ্টতার জন্য যুক্ত করা হয়েছে):

# 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;
    }
}

আপনার এটি ব্যাখ্যা করতে সক্ষম হওয়া উচিত; এর অর্থ হল যে ওআর এর একটি উচ্চতর প্রাধান্য রয়েছে এবং আপনার উদাহরণ প্রকৃতপক্ষে বাড়ে if ( (A OR B) AND (C OR D) )। উদাহরণস্বরূপ, যদি এই শর্তগুলি থাকে:

RewriteCond A [or]
RewriteCond B [or]
RewriteCond C
RewriteCond D

এটি হিসাবে ব্যাখ্যা করা হবে if ( (A OR B OR C) and D )


1
উদাহরণস্বরূপ উত্স কোডটি কার্যকর করা আমার কাছে মনে হয় given প্রদত্ত htaccess উত্পাদন করে ((এআর বি) এবং সি) বা ডি) [অর্থাত্ ওপি আশা করে না এবং আপনি প্রাথমিকভাবে যা গণনা করেছেন] তাও নয়। আপনি আমার ব্যাখ্যা ত্রুটি খুঁজে পেতে সাহায্য করতে পারেন? [আরও বিস্ফোরিত হতে হবে, বিপরীতটি সম্পর্কে কী: যদি কেউ ((এআর বি) এবং (সি ও ডি)) প্রয়োগ করতে চায় তবে .htaccess ফাইলে একটি কোডের ঠিক কী হওয়া উচিত?]
চক কলার্স

3
'ওপেন সোর্সটির একটি বৃহত সুবিধা উপস্থাপনের জন্য :) +1 - @ চককোলার্স যুক্তিটি (((এ বা বি) এবং সি) বা ডি) কিন্তু (এ বা বি) এবং (সি বা ডি) উত্পাদন করতে পারে না। প্রতিটি পাসে লুপটি এটি CONDFLAG_ORNEXT পরীক্ষা করে যা কেবলমাত্র এ এবং সি দেখার সময় সেট করা হবে যখন এটি সেট করা হয় এটি বর্তমান শর্তটি পাস হলে এটি পরবর্তী শর্তটি এড়িয়ে যায় বা বর্তমান অবস্থাটি ব্যর্থ হয় না বলে চালিয়ে যায় কারণ ভবিষ্যতের পরিস্থিতি হতে পারে পাস এবং ওআর গ্রুপের সর্বশেষে পতাকা সেট থাকবে না তাই সমস্ত কিছু ব্যর্থ হলে পুরো জিনিস ব্যর্থ হয়।
টেম্পেক

1
কীভাবে ((এ এবং বি) বা (সি এবং ডি)) করা যায় তা সম্পর্কে আমার মাথা পেতে পারে না - আমি (এ এবং (বি বা সি) এবং ডি) দিয়ে শেষ করেছি
পিট

@ উইলশোমিডিয়া আপনি এটি (দুটি (এ এবং বি) বা (সি এবং ডি)) দুটি পৃথক নিয়মে বিভক্ত করে করতে পারেন: রাইরাইটকন্ড এ রিরাইটকন্ড বি রিরাইটরুলেশন এবি রাইরাইটকন্ড সি রিরাইটকন্ড ডি রিরাইটরল সিডি
আইজাক

3

অনেক সংগ্রামের পর একটি সাধারণ নমনীয় এবং আরো পাঠযোগ্য সমাধান পটে যাবেন চাই, আমার ক্ষেত্রে আমি সংরক্ষণ শেষ পর্যন্ত বা মধ্যে গুলি ফলাফল ENV ভেরিয়েবল এবং করছেন এবং গুলি যারা ভেরিয়েবল।

# 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...

প্রয়োজনীয়তা :

  • অ্যাপাচি Mod_env সক্ষম হয়েছে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.