सवाल रीवाइटकंड फ़ाइल-मौजूद है मौजूदा फाइलों के लिए चेक विफल रहता है


मेरे पास इस पुनर्लेखन नियम के साथ एक अजीब परिदृश्य है:

RewriteCond img/$2/$3/$4/$1 -f
RewriteRule ^img/(([a-z0-9]{4})([a-z0-9]{4})([a-z0-9]{4})[a-z0-9]{28}\.\w+)$ img/$2/$3/$4/$1 [L]

इसके लिए निर्देशिका संरचना (सरलीकृत) है:

var/
  images/
    ..
  www/
    .htaccess
    img -> /var/images

दूसरे शब्दों में, छवियों को वेब डेटा के बाहर एक सामान्य डेटा-स्टोरेज एरिया में संग्रहीत किया जाता है और वे वेबूट में जुड़े होते हैं img एक प्रतीकात्मक लिंक के माध्यम से निर्देशिका। छवि नाम हैंश हैं। दक्षता के लिए, वे एक तीन-स्तर की गहरी निर्देशिका पदानुक्रम में संग्रहीत हैं। उदाहरण के लिए:

0a808e34edaaeeffd973e4138789a4957d6b6a26.jpg

पर संग्रहीत है

images/0a80/8e34/edaa/0a808e34edaaeeffd973e4138789a4957d6b6a26.jpg

पुनर्लेखन नियम फ़ाइल नाम को नेस्टेड निर्देशिका संरचना में फिर से लिखता है।

अब, अजीब बात यह है कि RewriteCond मेरे स्थानीय सिस्टम पर ठीक काम करता है लेकिन एक परीक्षण सर्वर पर विफल रहता है। अपाचे डीबग लॉग स्पष्ट रूप से कहता है कि "-f पैटर्न इस स्थिति के लिए "मेल नहीं खाता है। अगर मैं बस इस स्थिति को हटा देता हूं तो पुनर्लेखन नियम ठीक काम करता है और छवि परोसा जाता है।

क्या कारण हो सकता है -f फाइलों के लिए असफल होने के लिए जो स्पष्ट रूप से मौजूद हैं?

FollowSymLinks की अनुमति है। Apache संस्करण 2.2.22-6ubuntu2 apt के माध्यम से स्थापित और शायद ही संशोधित। अपाचे 2.2.23 (होमब्रू के माध्यम से) के स्थानीय इंस्टॉल पर काम करता है। कोई महत्वपूर्ण नहीं देख सका परिवर्तन दो संस्करणों के बीच जो इसका कारण बनना चाहिए।


वास्तविक निर्देशिका संरचना के बारे में कुछ और संभावित रूप से महत्वपूर्ण विवरण:

$ ls -l /var/www/myapp/current
[snip] /var/www/myapp/current -> /var/www/myapp/releases/20130418090750

$ ls -la /var/www/myapp/current/webroot
[snip]
[snip] .htaccess
[snip] img -> /usr/local/var/myapp/images

अपाचे वेबूट को इस प्रकार कॉन्फ़िगर किया गया है:

DocumentRoot /var/www/myapp/current/webroot

अगर मैं लिखता हूं RewriteCond जैसा:

RewriteCond /usr/local/var/myapp/images/$2/$3/$4/$1 -f

यह काम करता हैं। मैं पूर्ण पथ को हार्डकोड नहीं करना चाहूंगा, हालांकि अगर सभी टिकाऊ हो।

मई अपाचे को सिम्लिंक के कई स्तरों से भ्रमित किया जा सकता है?


7
2018-04-12 13:14


मूल


मल्टीव्यूज़ के बारे में क्या? - Felipe Alameda A
मल्टीव्यू सक्षम हैं। क्या यह कारण हो सकता है? ऐसा कैसे? - deceze
दिलचस्प। मैं जांच करूंगा कि इससे कोई फर्क पड़ता है या नहीं। - deceze
नहीं, रिपोर्ट करने के लिए खेद है कि उसने कुछ भी नहीं बदला है। - deceze
@ सर्वेंट क्या स्पष्ट नहीं है, कृपया? RewriteCond  -f नियम पुनर्लेखित फ़ाइल को नहीं देखता है, भले ही RewriteRule कर देता है। प्रश्न है क्यूं कर? - deceze


जवाब:


असल में, मैंने अभी तक एक ऐसा लेख नहीं देखा है जिसके बारे में एक ट्यूटोरियल है RewriteCond से एक चर प्राप्त करने के लिए RewriteRule इसके नीचे .. हालांकि, आप अभी भी एक जोड़ने की कोशिश कर सकते हैं RewriteBase आपके शीर्ष पर निर्देश .htaccess फ़ाइल:

RewriteBase /www/

या यह, बस एक कोशिश करो:

RewriteBase /var/www/

या आप नीचे दिए गए निर्देशों के इन सेटों में से एक को आजमा सकते हैं लेकिन को छोड़कर कोई भी RewriteBase निर्देश जो ऊपर सूचीबद्ध है:

RewriteCond /www/img/$2/$3/$4/$1 -f
RewriteRule ^www/img/(([a-z0-9]{4})([a-z0-9]{4})([a-z0-9]{4})[a-z0-9]{28}\.\w+)$ /www/img/$2/$3/$4/$1 [L]

या आप इसे भी आज़मा सकते हैं:

RewriteCond /var/www/img/$2/$3/$4/$1 -f
RewriteRule ^var/www/img/(([a-z0-9]{4})([a-z0-9]{4})([a-z0-9]{4})[a-z0-9]{28}\.\w+)$ /var/www/img/$2/$3/$4/$1 [L]

मुझे आपकी रीराइट स्थिति और नियम के प्रारूप की प्रतिलिपि बनाने के लिए खेद है, क्योंकि आपने कहा था "यह आपके स्थानीय विकास प्रणाली पर काम करता है।" लेकिन यह एकमात्र नियम है जो मैं आपको सलाह देता हूं कि अगर आप अभी लिखना चाहते हैं /$var1.$var2 में /images/0a80/8e34/edaa/$var1.$var2, आप दूसरों को स्थिर रूप से भी जोड़ सकते हैं, एक-एक करके:

RewriteRule ^([a-zA-Z0-9_-]+).([a-zA-Z]{3})$ /images/0a80/8e34/edaa/$var1.$var2

या यदि आप फिर से लिखना चाहते हैं तो आप इसे भी आजमा सकते हैं /img/0a808e34edaaeeffd973e4138789a4957d6b6a26.jpg गतिशील रूप से में /img/0a80/8e34/edaa/0a808e34edaaeeffd973e4138789a4957d6b6a26.jpg स्थिति के साथ यदि गतिशील यूआरएल जहां यह रीपैपिंग एक फ़ाइल है:

RewriteCond /img/$2/$3/$4/$1\.$5 -f
RewriteRule ^img/(([a-z0-9]{4})([a-z0-9]{4})([a-z0-9]{4})[a-z0-9]{28})\.([a-z]{3})$ /img/$2/$3/$4/$1.$5

याद रखें कि पात्रों पर "0a80", "8e34" तथा "Edaa" 4 और वर्णों के रूप में सटीक होना चाहिए। में "Eeffd973e4138789a4957d6b6a26" 28 और अंदर होना चाहिए "Jpg" 3 के रूप में होना चाहिए। मुझे उम्मीद है कि यह काम करेगा, लेकिन मुझे शक है ..


1
2018-04-16 11:13



RewriteBase एक निर्दिष्ट करने के लिए है यूआरएल, यह वास्तव में इस मामले में लागू नहीं होता है। में पूर्ण पथ का उपयोग करना RewriteCond काम करता है, लेकिन सिस्टम-विशिष्ट। htaccess फ़ाइलों से बचने के लिए मैं इससे बचना चाहता हूं। मुझे यह भी एक स्पष्टीकरण में दिलचस्पी है कि यह क्यों काम नहीं करता है, क्योंकि मुझे वास्तव में इसकी आवश्यकता नहीं है RewriteCond बिल्कुल भी। - deceze


यदि यह लोकलहोस्ट पर काम करता है, लेकिन test.com नहीं, तो मुझे लगता है कि यह आपके फाइल सिस्टम के साथ एक समस्या है या यह अधिक सामान्य साइट कॉन्फ़िगरेशन से संबंधित है जिसे आप स्वीकार कर सकते हैं। क्या आपने दोनों ऑपरेटिंग सिस्टम स्थापित किए हैं, और फिर दोनों मशीनों पर एक ही प्रक्रिया का उपयोग करके, उसी पैकेज को स्थापित करते हैं? प्रत्येक अपाचे के साथ भेजे गए प्रत्येक डिफ़ॉल्ट कॉन्फ़िगरेशन की तरह क्या दिखता है? इससे पहले कि आप एक नज़र डालने से पहले संकुल के बारे में क्या है जो डिफ़ॉल्ट विन्यास को संशोधित करता है?

हो सकता है कि आपके अपाचे संस्करण समान हैं, लेकिन यदि वे विभिन्न स्रोतों से थे, तो डिफ़ॉल्ट कॉन्फ़िगरेशन अलग हो सकता था और बाद में इसे अलग-अलग संशोधित किया जा सकता था। शीर्ष से शुरू अपनी कॉन्फ़िगरेशन सत्यापित करें। क्या अंतर है? उन्हें बिल्कुल वही दिखने की कोशिश कर रहा है (न केवल आपके पुनर्लेखन, बल्कि वर्चुअल-होस्ट या सर्वर संदर्भ।)

आपके रिवाइट निर्देशों का संदर्भ संभवतः मदद करेगा (जैसा कि मुझे लगता है कि यह गुंजाइश का मुद्दा है)। क्या वर्चुअलहोस्ट, दस्तावेज़-रूट, निर्देशिका संदर्भ में पुनर्लेखन हैं?

सफलता और विफलता के बीच आपकी पोस्ट से सबसे बड़ा अंतर यह है:

सापेक्ष

RewriteCond img/$2/$3/$4/$1 -f

पूर्ण

RewriteCond /usr/local/var/myapp/images/$2/$3/$4/$1 -f

अपाचे फ़ाइल ढूंढने में सक्षम है, इसलिए इसे अनुमतियां या ऐसी कोई अनुमति नहीं होनी चाहिए। क्या आप किसी भी उपनाम निर्देश (लोकलहोस्ट बनाम test.com) का उपयोग कर रहे हैं? यदि नहीं, तो शायद आपको यह विशेष रूप से उपनाम का प्रयास करना चाहिए:

/ var / www / myapp / current -> / var / www / myapp / रिलीज / 20130418090750

अपने रूट कॉन्फ़िगरेशन में कम से कम एक हार्ड पथ रखें जिसे सिमलिंक की आवश्यकता नहीं है। आप एक निर्देशिका संदर्भ में अपने rewrites लपेट सकते हैं ...

<Directory /var/www/myapp/current/webroot>
    rewrite statements...
</Directory>

क्या होता है यदि आप test.com पर अपनी टूटी हुई कॉन्फ़िगरेशन को बनाए रखते हैं, लेकिन जहां आपके पास वर्तमान में सिम्लिंक हैं, तो रूट पर शुरू होने वाली वास्तविक निर्देशिका (अस्थायी रूप से) की प्रतिलिपि बनाने का प्रयास करें। बस सत्यापित करें कि कुछ ढीली सिम्लिंक सेटिंग फ़्लोटिंग नहीं है। जितना संभव हो उतने सिम्लिंक से छुटकारा पाएं और उन्हें 1 से 1 में वापस रखें।


1
2018-04-21 05:32





बैकरेफर "अप" (रीराइटसाइट) को "डाउन" (रीवाइट्रूल) में हैं। आपके द्वारा प्रकाशित उदाहरण में "डाउन" की तरह "अप" है। और यह backreferences $ के साथ% के साथ हैं।

रिवाइटकंड बैकरेन्फरेंस: ये फॉर्म% N (0 के बैक्रेरेंस हैं   <= एन <= 9)। % 1 से% 9 समूहित भागों तक पहुंच प्रदान करता है (फिर से, में   अंतिम मिलान किए गए रिवाइटकंड से पैटर्न के, कोष्ठक)   शर्तों का वर्तमान सेट। % 0 पूरे स्ट्रिंग तक पहुंच प्रदान करता है   उस पैटर्न से मेल खाता है।

आप इसे आजमा सकते हैं:

RewriteBase /
RewriteCond %{REQUEST_URI} /img/([a-z0-9]{4})([a-z0-9]{4})([a-z0-9]{4})([a-z0-9]{28}\.\w+)$
RewriteCond %{DOCUMENT_ROOT}/test/%1/%2/%3/%4 -f
RewriteRule .* img/%1/%2/%3/%4 [L]

चर खोजने के लिए सबसे पहले नियमित अभिव्यक्ति। फ़ाइल मौजूद है, तो चर के साथ फ़ाइल का पथ बनाया गया है और सत्यापित है

मैंने उपयोग किया % {} DOCUMENT_ROOT मेरे स्थानीय सर्वर पर परीक्षण के लिए। यदि आपके पास एक ही दस्तावेज़ रूट में यह छवि फ़ाइलें नहीं हैं तो आपको इसकी आवश्यकता है पूरा रास्ता पसंद:

RewriteCond /var/www/cache_images/test/%1/%2/%3/%4 -f

-1
2018-02-01 19:44



आदेश में मूल्यांकन का मूल्यांकन किया जाता है रिवाइटरूल मैच, रिवाइटकंड मैच, रिवाइटरूल रीराइट। तो "नीचे तक" काम करता है। रिवाइटरूले बैक संदर्भों द्वारा संदर्भित किया जाता है $n और रिवाइटकॉन्ड बैक संदर्भों द्वारा संदर्भित किया जाता है %n। यह वास्तव में काम करता है। - deceze
आप सही हे। आप अपनी सेटिंग्स के अंतिम संस्करण को रखने के लिए अपना प्रश्न संपादित कर सकते हैं, इसलिए समाधान स्पष्ट होगा। मैं त्रुटि (ऊपर और नीचे) को साफ़ करने के लिए अपना उत्तर संपादित करूंगा, और किसी भी मामले में, मेरा उदाहरण भी काम करता है :) - Gabriel Pérez S.