2012-06-17 13 views
12

नहीं है, मैंने इस प्रश्न के उत्तर के लिए Google और StackOverflow पर चारों ओर देखा है, लेकिन तथ्य यह है कि मुझे .htaccess के बारे में बहुत कुछ पता नहीं है, यह तय करने में मेरी सहायता नहीं करता कि सही उत्तर क्या हैं मेरी स्थिति के लिए, इसलिए मैं यहां पूछ रहा हूं।.htaccess रीवाइटकॉन्ड जहां यूआरआई में डोमेन

मेरी स्थिति यह है कि मेरे पास ऐसी कई साइटें हैं जो सर्वर पर रूट के समान भौतिक निर्देशिका का उपयोग कर रही हैं।

यह सब ठीक काम कर रहा है लेकिन मैं यह सुनिश्चित करना चाहता था कि प्रत्येक साइट ब्राउज़र से एक-दूसरे की छवियों आदि तक पहुंच न सके, जब तक वे सही डोमेन पर न हों।

/resources/{resource}/{full_domain_name} 

इसलिए उदाहरण www.domain.co.uk के लिए इस तरह की एक संरचना के लिए होता है:

वर्तमान में मैं इस तरह की एक फ़ाइल संरचना है

http://www.domain.co.uk/resources/images/www.domain.co.uk/some_image.jpg 

लेकिन www.domain_2.co.uk साइट के लिए एक ही भौतिक निर्देशिका का उपयोग करता है, तो मौजूद है रूट तो वे अन्य डोमेन के संसाधनों को अपने डोमेन से देख सकते हैं, जैसे:

http://www.domain_2.co.uk/resources/images/www.domain.co.uk/some_image.jpg 

यह वास्तव में एक बड़ी समस्या नहीं है क्योंकि इन निर्देशिकाओं में पूरी तरह से कोई संवेदनशील जानकारी संग्रहीत नहीं है, लेकिन यह अधिक परेशानी है और मैं इसके बजाय उपयोगकर्ता इसे करने में सक्षम नहीं था (ऐसा नहीं कि वास्तव में कोई भी अब तक है)।

मैं/संसाधन निर्देशिका में एक .htaccess फ़ाइल डाल करने की कोशिश की, लेकिन मैं नियमित अभिव्यक्ति आदि के साथ अटक कर रहा हूँ

मैं मूल रूप से यह सुनिश्चित करें कि यूआरआई वर्तमान डोमेन नाम अन्यथा एक 403 को रीडायरेक्ट करते हैं बनाना चाहते त्रुटि पृष्ठ

RewriteCond %{REQUEST_URI} !^(/resources/[^/]*/%{HTTP_HOST})(.*)$ 
RewriteRule ^(.*)$ /error/403.php 

कारण मैं डाल में [^/] सा है, क्योंकि उदाहरण के लिए कई फ़ोल्डर हैं,:

/resources/images/{full_domain_name} 
/resources/scripts/{full_domain_name} 
/resources/stylesheets/{full_domain_name} 

किसी को भी इन के साथ मेरी मदद कर सके

यह है कि मैं क्या लेकर आए हैं शर्तेँ?

किसी भी मदद की सराहना की जाएगी।

+0

आपके वर्तमान नियम का नतीजा क्या है? ऐसा लगता है कि यह काम करेगा, सिवाय इसके कि आपको किसी भी '()' आसपास '/ संसाधन/[^ /] * /% {HTTP_HOST} की आवश्यकता नहीं है। *' –

+0

@ माइकल वर्तमान में यदि मैं www.domain.co पर हूं .uk और www.domain.co.uk/resources/stylesheets/www.domain.co.uk/style.css पर जाएं उदाहरण के लिए यह हमेशा मुझे /error/403.php फ़ाइल पर रीडायरेक्ट करता है। जब मैं .htaccess नियम को हटा देता हूं तो यह फ़ाइल को पाता है क्योंकि इसे सामान्य रूप से करना चाहिए। –

+0

आपको वास्तव में regex में प्रतिनिधित्व किए गए पूरे '% {REQUEST_URI} 'की आवश्यकता नहीं है। आप http_host 'रीवाइटकॉन्ड% {REQUEST_URI} से मेल खा सकते हैं!^+% {HTTP_HOST}' –

उत्तर

10

यह बहुत ही भयानक सवाल है और यदि मैं 10+ बार उभरा होता तो मैं कर सकता। मैं अपना जवाब पोस्ट कर रहा हूं भले ही आपके पास एक स्वीकार्य उत्तर है क्योंकि मुझे जवाब के साथ आने के लिए वास्तव में अपने सभी अपाचे संसाधनों को खोदना पड़ा था।

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

RewriteCond %{HTTP_HOST}:%{REQUEST_URI} !^([^:]+):/resources/[^/]+/\1/.+ [NC] 
RewriteRule ^resources/[^/]+/[^/]+/.+ - [F,NC,NE] 

पुनश्च:: यहाँ नियम आप इस समस्या के लिए की आवश्यकता होगी जब से हम के रूप में वापस-संदर्भ, मैं RewriteCond यहाँ में विशेष regex बैक संदर्भ चर \1 उपयोग कर रहा हूँ आरएचएस पर % चर का उपयोग नहीं कर सकते।

+1

मैं आमतौर पर ऐसा नहीं करता लेकिन इस मामले में मुझे लगता है कि मैं बदलूंगा मेरा स्वीकार्य उत्तर, क्योंकि यह समस्या का एक सही समाधान प्रदान करता है। अपना उत्तर अनुभावा पोस्ट करने के लिए धन्यवाद, यह बहुत सराहना की है! –

+0

आपका स्वागत है और इस तरह की एक रोचक समस्या पोस्ट करने के लिए धन्यवाद, जिसने मुझे नए mod_rewrite चाल भी सीखने के लिए :)। – anubhava

3

इस हालत के लिए अपर्याप्त है:

RewriteCond %{REQUEUST_URI} !^(/resources/[^/]*/%{HTTP_HOST})(.*)$ 

क्योंकि मैं कुछ भी है कि /resources/ साथ शुरू नहीं करता अनुरोध करते हैं तो, मैं 403.php त्रुटि पृष्ठ मिलेगा।

RewriteCond %{REQUEST_URI} ^/resources/[^/]+/([^/]+)/ 
RewriteCond %{HTTP_HOST} !%1 

या

RewriteCond %{REQUEST_URI} ^/resources/[^/]+/([^/]+)/ 
RewriteCond %{REQUEST_URI} !^/resources/[^/]+/%{HTTP_HOST}/ 

कहाँ पहली शर्त जाँच कर रहा है कि अनुरोध एक संसाधन के लिए है, तो दूसरा जाँच मेजबान: क्या आप वास्तव में चाहते हैं कुछ इस तरह है। हाउवर, इनमें से कोई भी काम नहीं करेगा क्योंकि mod_rewrite का RewriteCond निर्देश % स्थिति के दाईं ओर चर या बैकरेफर की अनुमति नहीं देता है, केवल बाएं।इसी तरह, यदि आप ऐसा नहीं कर सकते हैं या तो:

RewriteCond %{REQUEST_URI} ^/resources/[^/]+/([^/]+)/ 
RewriteRule !^/resources/[^/]+/%{HTTP_HOST}/ /error/403.php 

क्योंकि RewriteRule की अभिव्यक्ति के बाद से यह एक regex है उस में चर नहीं हो सकता, और यह सचमुच अनुरोध में दिए गए होस्ट इसकी जगह के बजाय एक %{HTTP_HOST} की उम्मीद है। तो निष्कर्ष निकालने के लिए, नहीं, आप इस तरह mod_rewrite की शर्तों के साथ ऐसा नहीं कर सकते हैं।

कुछ ऐसा जो आप कोशिश कर सकते हैं यदि आपके पास सर्वर कॉन्फ़िगरेशन या vhost config तक पहुंच है, तो RewriteMap बनाना और %{REQUEST_URI} और %{HTTP_HOST} दोनों में पास करना है। इसलिए यदि आपके मानचित्र check_host कहा जाता है तो अपने नियम कुछ इस तरह लग सकता है:

RewriteRule ^resources/[^/]+/([^/]+)/ ${check_host:%{HTTP_HOST}_%{REQUEST_URI}} 

और अपनी स्क्रिप्ट बस, इनपुट को पार्स पहले _ से अलग हो गए, अनुरोध URI पार्स और यह सुनिश्चित करें मेजबान करने की आवश्यकता होगी HTTP_HOST जैसा ही है। यदि यह वही है, तो उसी अनुरोध को यूआरआई आउटपुट करें, अन्यथा त्रुटि यूआरआई आउटपुट करें। अगर आपके पास सर्वर या vhost config तक पहुंच नहीं है, तो मुझे लगता है कि आप भाग्य से बाहर हैं। RewriteMap htaccess फ़ाइल में परिभाषित नहीं किया जा सकता है।

+0

इस जवाब के लिए धन्यवाद जॉन लिन। मुझे नहीं पता था कि आप% वैरिएबल या बैक रेफरेंस को रीवाइटकंड के दाईं ओर नहीं डाल सका। मैंने रीवाइटमैप को आजमाने का विकल्प चुना है, लेकिन यदि किसी भी कारण से मैं ऐसा नहीं कर सकता तो मुझे यकीन है कि मुझे mod_rewrite के बाहर एक और रास्ता मिल जाएगा :) –

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