2008-08-21 12 views
39

को छोड़कर मैं अपाचे 2.2 वर्चुअलहोस्ट घोषणा में mod_rewrite का उपयोग करके किसी अन्य डोमेन पर अपने डोमेन पर सभी अनुरोधों को पुनर्निर्देशित करने का प्रयास कर रहा हूं। इसमें एक अपवाद है - मुझे रीडायरेक्ट होने के लिए /audio पथ पर सभी अनुरोध चाहिए।mod_rewrite नियम सभी अनुरोधों को पुनर्निर्देशित करने के लिए एक विशिष्ट पथ

मैंने ऐसा करने के लिए एक रिवाइटकंड और रिवाइटरूल लिखा है लेकिन यह बिल्कुल सही नहीं है और मैं यह नहीं समझ सकता कि क्यों। नियमित अभिव्यक्ति में स्ट्रिंग "/ ऑडियो" के लिए एक नकारात्मक लुकहेड होता है, लेकिन किसी कारण से यह मेल नहीं खाता है। यहाँ परिभाषा है:

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net(?!/audio) [NC] 
RewriteRule ^(.*)$ http://www.newdomain.net [L,R=301] 

अगर मैं करने के लिए RewriteCond बदलने के लिए:

RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net/(?!audio) [NC] 

(यानी नकारात्मक अग्रदर्शी भाग के बाहर फ़ॉरवर्ड स्लैश डाल) तो यह काम करता है, लेकिन इस के नकारात्मक पक्ष यह है कि अनुरोध है पीछे की ओर स्लैश के बिना mydomain.net पर पुनर्निर्देशित नहीं किया जाएगा।

क्या कोई यह बता सकता है कि मैं क्या गलत कर रहा हूं?

(नोट:! RewriteRule सा ऊपर StackOverflow.com से जोड़े जा रहे हैं में डोमेन के आसपास कोण कोष्ठक - वे वास्तविक कोड में नहीं हैं)


यहाँ नियम हैं:

<VirtualHost *:80> 
ServerAdmin [email protected] 
DocumentRoot "/var/www/mydomain.net/htdocs" 
ServerName www.mydomain.net 
ServerAlias mydomain.net 

RewriteEngine on 
RewriteCond {REQUEST_URI} !^/audio 
RewriteRule ^(.*)$ http://www.newdomain.net [L,R=301] 
RewriteLog logs/mod_rewrite_log 
RewriteLogLevel 3 

ErrorLog logs/error_log 
CustomLog logs/access_log common 
</VirtualHost> 

धन्यवाद @mercutio - कि सही समझ में आता है लेकिन यह अभी भी काम करने के लिए प्रतीत नहीं होता।

(2) init rewrite engine with requested uri /audio/something.mp3 
(3) applying pattern '^(.*)$' to uri '/audio' 
(2) rewrite '/audio' -> 'http://www.newdomain.net/' 
(2) explicitly forcing redirect with http://www.newdomain.net 
(1) escaping http://www.newdomain.net for redirect 
(1) redirect to http://www.newdomain.net [REDIRECT/301] 

के बाद से REQUEST_URI /audio के साथ शुरू होता है मैं फिर से लिखना पर ध्यान नहीं दिया की उम्मीद करेंगे:

यहाँ जब मैं http://mydomain.net/audio/something.mp3 के लिए अनुरोध करने के लिए क्या mod_rewrite लॉग कहते है।

+0

पैटर्न लागू करने के यूरी '/ ऑडियो' के लिए लगता है जैसे यह एक अलग पैटर्न को संसाधित कर रहा है। या शायद तर्क अभी पीछे की तरफ है। क्या आप अपना पूरा नियम निर्धारित कर सकते हैं? – mercutio

उत्तर

47

HTTP_HOST में केवल होस्ट नाम है, न कि अनुरोध किए गए यूआरएल का पथ।

RewriteCond %{REQUEST_URI} !^/audio 

आपको बस इतना चाहिए।

इसके अलावा, आप निम्नलिखित के साथ रीराइट इंजन है, जो देखने के लिए अपनी शर्तों और नियमों का मिलान नहीं हुआ जा रहा है कि कैसे वास्तव में उपयोगी है से डिबग जानकारी प्राप्त कर सकते हैं: '(। *)^$'

RewriteLog /path/to/log/file 
RewriteLogLevel 3 
+0

आपको एक और जोड़ने के बजाय, अपना जवाब संपादित करना चाहिए था। –

+0

अद्यतन: रिवाइटकॉन्ड अभी भी सही है, लेकिन अपाचे के संस्करणों में> = 2.4, रिवाइटलॉग अब काम नहीं करता है। आप 'LogLevel rewrite: trace3' के साथ mod_rewrite के लिए Loglevel विशिष्ट सेट कर सकते हैं लेकिन फिर आउटपुट के लिए त्रुटि लॉग देखने की आवश्यकता है। – mightypile