2012-05-22 10 views
19

tl; डॉ: मैं ऐसा कैसे करते हैं एक .conf या .htaccess फ़ाइल में निम्नलिखित:अपाचे कॉन्फ़िगरेशन में अपाचे संस्करण का पता लगाएं?

<IfApache22> 
    # Do A 
</IfApache22> 
<IfApache24> 
    # Do B 
</IfApache24> 

अब सवाल:

अपाचे 2.4 के साथ वर्ष Order मिलता है के पक्ष में पदावनत Require

मेरी .htaccess फ़ाइलों में मैं

<FilesMatch "\.(long|list|file|types)$"> 
    Order allow,deny 
</FilesMatch> 

जिसका अर्थ है अपाचे जब तक कि मैं access_compat सक्षम शुरू करने के लिए विफल रहता है की है। ऐसा करने पर एक उपयोगी कामकाज प्रस्तुत करता है, मैं एक समाधान चाहता हूं जो सिंटैक्स दोनों के साथ काम करता है क्योंकि कॉन्फ़िगरेशन को कई सर्वरों में वितरित किया जाएगा। सवाल यह है कि मैं अपाचे के वर्तमान संस्करण का पता कैसे लगा सकता हूं और सही निर्देश लागू कर सकता हूं।

मैं बहुत से लोगों द्वारा वितरित और उपयोग किए जाने वाले ढांचे के लिए फ़ाइल का उपयोग करना चाहता हूं, और मैं नियंत्रित/गारंटी नहीं दे सकता कि उनके पास कोई विशेष सर्वर सेटअप है या नहीं, इसलिए मैं चाहूंगा फ़ाइल 2.2/2.4 "अज्ञेयवादी" होने के लिए।

उत्तर

2

आप उसी होस्ट पर अपाचे के विभिन्न संस्करण चला सकते हैं। प्रश्न: अलग निर्देशिका में अलग कॉन्फ़िगरेशन फ़ाइलों के साथ क्या गलत है? मैं ईमानदारी से मानना ​​है कि शायद साफ दृष्टिकोण है ...

फिर भी, अपाचे .conf फ़ाइलें एक <IfDefine>, जो आपको "डी" के साथ कार्यावधि में निर्दिष्ट कर सकते हैं अनुमति देते हैं:

http://httpd.apache.org/docs/2.0/mod/core.html#ifdefine

+1

+1 iffefine और -D विकल्प के लिए +1। हालांकि यह वास्तव में मेरी मदद नहीं करता है। वेबसर्वर के दो संस्करणों को चलाना _a lot_ काम जैसा लगता है जब एक सरल अगर/इसे हल करने में सक्षम होना चाहिए। क्या आप थोड़ा अलग "अलग निर्देशिका" का विस्तार कर सकते हैं? वर्तमान संस्करण की जांच करना मेरे लिए बहुत अच्छा समाधान लगता है। क्यों सवाल उठाया थोड़ा सवाल। – Letharion

27

एक हैक है कि मैं उपयोग किया है।

# Apache 2.2 
<IfModule !mod_authz_core.c> 
    Satisfy Any 
</IfModule> 

# Apache 2.4 
<IfModule mod_authz_core.c> 
    Require all granted 
</IfModule> 
+1

... या यदि वह मॉड्यूल दोनों सिरों पर अनुपस्थित है, लेकिन आपका स्थानीय/स्टेज सर्वर जीत गया है (और अपाचे 2.x) और आपका लाइव लिनक्स (और अपाचे 2.y) है, तो किसी भी अन्य मॉड्यूल अंतर की जांच करें, यानी '' –

+0

शानदार उत्तर। सब कुछ 2.4 के लिए निर्माण लगता है, लेकिन मेरा 2.2 है, यह आगे संगतता की अनुमति देता है! – Keith

1

आप अपने अभिगम नियंत्रण के लिए mod_rewrite का उपयोग कर से पता करने के लिए की जरूरत को बायपास कर सकता:

RewriteEngine On 
RewriteCond %{REQUEST_URI} !\.(long|list|file|types)$ 
RewriteRule .* - [F,L] 
14

मान लिया जाये कि आप mod_version स्थापित (कई वितरण डिफ़ॉल्ट रूप से यह जहाज) आप निम्न कर सकते हैं:

<IfVersion >= 2.4> 
    # Require ... 
</IfVersion> 
<IfVersion < 2.4> 
    # Order ... 
    # Deny ... 
    # Allow ... 
</IfVersion> 
+3

मैं इस उत्तर की सिफारिश करता हूं। यदि आप अतिरिक्त निर्भरता पर खर्च कर सकते हैं तो यह दृष्टिकोण बहुत स्पष्ट है। साथ ही, अगर स्वीकार किए गए उत्तर में दृष्टिकोण का उपयोग करते समय mod_authz_core कभी अक्षम हो जाता है तो कॉन्फ़िगरेशन फ़ाइल मान लेगी कि यह 2.2 पर चल रही है और परवाह किए बिना जारी रहेगी। यहां mod_version को हटाने का मतलब यह होगा कि सर्वर शुरू करने से इंकार कर देगा। – seanhodges

1

मैं इस समस्या में भाग गया क्योंकि FallbackResource Apache के शुरुआती संस्करणों में नहीं है और अक्सर चालाक होस्टिंग कंपनियां एक के संस्करण होने के बाद mod_rewrite को हटा देती हैं FallbackResource के साथ पैच। मैं निम्नलिखित .htaccess का उपयोग जब मैं पुस्तकालय कोड ऊपर है कि अपने पर्यावरण के लिए adapts रखना चाहता हूँ:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteRule^- [E=protossl] 
    RewriteCond %{HTTPS} on 
    RewriteRule^- [E=protossl:s] 
    RewriteRule "(^|/)\." - [F] 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_URI} !=/favicon.ico 
    RewriteRule^index.php [L] 
</IfModule> 

<IfModule !mod_rewrite.c> 
    FallbackResource index.php 
</IfModule> 

अब निश्चित रूप से वहाँ कुछ अपाचे के संस्करणों/सेटअप जहां यह विफल हो जाता है - लेकिन अगर mod_rewrite है, इसका इस्तेमाल और यदि नहीं, तो उम्मीद है कि FallbackResource वहां है।

संबंधित मुद्दे