2012-10-14 21 views
13

मुझे पता है कि पहले से ही इसी तरह के प्रश्न पूछे गए हैं लेकिन मुझे अपनी स्थिति के लिए कोई वास्तव में विशिष्ट उत्तर नहीं मिला है।। एकाधिक वातावरण में एचटीएसीएसी

मैं कई वातावरण (स्थानीय, देव, उत्पादन) पर चल रहे एक ExpressionEngine साइट है, और उन वातावरण में से प्रत्येक के विभिन्न .htaccess नियमों की जरूरत है:

सभी वातावरण

  • Remove index.php
  • 404 फ़ाइल
  • सेट करें 301 रीडायरेक्ट्स

विकास

  • पासवर्ड .htpasswd
  • बल HTTPS प्रोटोकॉल के साथ सुरक्षित रखें
  • रोकें साथ X-Robots-Tag

उत्पादन खोज इंजन अनुक्रमण

  • बल HTTPS प्रोटोकॉल
  • पुनर्निर्देशन गैर- www www करने के लिए उप डोमेन

स्थानीय

  • कोई विशिष्ट नियम।

मैंने कई उदाहरण देखे हैं कि आप प्रति-मॉड्यूल विशिष्ट वातावरण कैसे सेट कर सकते हैं। Mod_rewrite मॉड्यूल के लिए RewriteCond %{REQUEST_HOST} ^dev.myurl.com और .htpasswd आवश्यकताओं के लिए tricks like this की तरह।

लेकिन जो मैं वास्तव में पसंद करूंगा वह वैश्विक पर्यावरण चर सेट करने का कोई तरीका है, फिर प्रति चर .htaccess फ़ाइल में उन चर का पुन: उपयोग करें। एक उदाहरण के रूप छद्म जावास्क्रिप्ट का उपयोग करने के लिए, कुछ की तरह:

var local = 'mysite.local'; 
var development = 'dev.mysite.com'; 
var production = 'www.mysite.com'; 

// Global .htaccess rules 

if(environment == local){ 
    // Local environment .htaccess rules 
} 

if(environment == development){ 
    // Development environment .htaccess rules 
} 

if(environment == production){ 
    //Production envirotnment .htaccess rules 
} 

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

मैंने अपाचे की कॉन्फ़िगरेशन फ़ाइलों में सेटिंग्स को बदलने के लिए कुछ संदर्भ देखे हैं, लेकिन स्पष्ट रूप से यह एक व्यवहार्य विकल्प नहीं है यदि मैं तृतीय-पक्ष होस्ट से निपट रहा हूं।

तो क्या यह पाई-इन-द-स्काई इच्छापूर्ण सोच है, या यह किया जा सकता है?

+0

मैं भर में आया था [इस अनुच्छेद] (http://www.thenerdary.net/पोस्ट/20 9 65499862/एचटीएसीएएस-वातावरण), जो मैंने अभी तक कोशिश नहीं की है लेकिन आशाजनक लग रही है। – kgrote

उत्तर

8

तो क्या यह पाई-इन-द-स्काई इच्छापूर्ण सोच है, या यह किया जा सकता है?

आईएमओ, हाँ। आप एनएनवी चर या उसके जैसा कुछ भी नियमों के अनुमानित "स्कॉइंग" प्राप्त करने में सक्षम नहीं होंगे।अपाचे में मनमाने ढंग से if(something) { do everything in here } मौजूद नहीं है। बहुत सारे निर्देश कुछ क्षेत्रों के अंदर काम नहीं करेंगे, और बाद में, जब आपको कुछ काम करने की जरूरत है, तो आपको बस इसमें संशोधन करने की तुलना में जो कुछ भी है, उसे तोड़ने की अधिक संभावना है।

सबसे अच्छा तरीका है not use htaccess files at all के लिए है:

आप पूरी तरह फ़ाइलों .htaccess का उपयोग कर आप मुख्य सर्वर कॉन्फ़िग फ़ाइल लिये httpd में पहुँच है या नहीं बचना चाहिए। .htaccess फ़ाइलों का उपयोग करना आपके अपाचे http सर्वर को धीमा कर देता है। किसी भी निर्देश जिसे आप .htaccess फ़ाइल में शामिल कर सकते हैं, Directory ब्लॉक में बेहतर सेट है, क्योंकि इसका बेहतर प्रदर्शन के साथ समान प्रभाव होगा।

स्थानीय, देव और उत्पादन के लिए एक अलग vhost बनाएँ। आवश्यकतानुसार उन्हें चालू या बंद करें, जो भी वैश्विक कॉन्फ़िगरेशन साझा करते हैं, उन्हें कहीं और स्टोर करें (जैसे global.includes नामक फ़ाइल में) और फिर सभी 3 vhosts में Include निर्देश का उपयोग करें। यदि आपको विशिष्ट निर्देशिकाओं पर नियम लागू करने की आवश्यकता है, तो htaccess फ़ाइलों के बजाय <Directory> ब्लॉक का उपयोग करें।

आप बल्कि इनको फ़ाइलों के अंदर सब कुछ छड़ी चाहते हैं तो आप सब कुछ in <IfDefine> blocks डालने की कोशिश कर सकते, यह शायद निकटतम बात आप अपने प्रश्न में अपने छद्म कोड करना होगा है। अनिवार्य रूप से की तरह कुछ:

# Global htaccess rules 
RewriteEngine On 
RewriteRule ^foo$ /bar [L] 

# Only local 
<IfDefine LocalInstance> 
    RewriteRule ^local/foo /bar [L] 
</IfDefine> 

# Only dev 
<IfDefine DevInstance> 
    RewriteRule ^dev/foo /bar [L] 
</IfDefine> 

# Only production 
<IfDefine ProductionInstance> 
    RewriteRule ^dev/foo /bar [L] 
</IfDefine> 

फिर जब आप अपाचे शुरू करते हैं, आप, (केवल एक तर्क के साथ) Define निर्देश का उपयोग कर अपने vhost config में -DLocalInstance में पारित करने के लिए -DDevInstance, या -DProductionInstance कमांड लाइन paramaeters के रूप में या कहीं आवश्यकता होगी । यह आसानी से काम करने की गारंटी नहीं है जैसा कि ऐसा लगता है, मैं पहले <IfDefine> के साथ अस्पष्ट मुद्दों में भाग गया हूं, खासकर अगर आप बहुत फैंसी पाने की कोशिश करते हैं।

+2

अपाचे HTTP सर्वर v2.4 में कोर एन्हांसमेंट्स में से एक है: ', , और अनुभाग प्रति-अनुरोध मानदंडों के आधार पर कॉन्फ़िगरेशन सेट करने के लिए उपयोग किए जा सकते हैं। 'जब तक आप उपयोग करना चाहते हैं, निर्देशिका संदर्भ का समर्थन करता है। http://httpd.apache.org/docs/trunk/mod/core.html#if –

10

जॉन का जवाब एक अच्छा है। दुर्भाग्यवश, सभी वेब होस्ट आपको अपाचे शुरू करने के लिए -D पैरामीटर को नियंत्रित करने की अनुमति नहीं देंगे।

यहाँ देव और उत्पादन पर एक भी htaccess फ़ाइल का उपयोग करने के लिए एक रास्ता है, लेकिन केवल देव साइट पासवर्ड से सुरक्षित है:

# ---------------------------------------------------------------------- 
# Password protect staging server 
# Use one .htaccess file across multiple environments 
# (e.g. local, dev, staging, production) 
# but only password protect a specific environment. 
# ---------------------------------------------------------------------- 

SetEnvIf Host staging.domain.com passreq 
AuthType Basic 
AuthName "Password Required" 
AuthUserFile /full/path/to/.htpasswd 
Require valid-user 
Order allow,deny 
Allow from all 
Deny from env=passreq 
Satisfy any