2011-05-15 10 views
7

मैं मॉड-रीराइट के साथ प्रयोग कर रहा था। मैंने सोचा कि मैं जो चाहता था वह सरल था लेकिन मुझे अनुरोध की गई फ़ाइल की यूआरआई REQUEST_URI के माध्यम से नहीं मिली है। इसके बजाय व्युत्पन्न नाम पारित किया गया है।mod-rewrite THE_REQUEST और (REQUEST_URI या REQUEST_FILE) अलग-अलग फ़ाइल नाम दें - क्यों?

manual का कहना है:

THE_REQUEST

पूर्ण HTTP अनुरोध लाइन सर्वर को ब्राउज़र द्वारा भेजा गया (जैसे, "प्राप्त /index.html HTTP/1.1")। इसमें ब्राउज़र द्वारा भेजे गए कोई अतिरिक्त शीर्षलेख शामिल नहीं हैं। यह मान (डीकोडेड) से अनदेखा नहीं हुआ है, नीचे अन्यके विपरीत अन्य संस्करणों के विपरीत।

REQUEST_URI

संसाधन HTTP अनुरोध लाइन में का अनुरोध किया। (ऊपर उदाहरण में, यह "/index.html" होगा।)

हालांकि दो मेरी परीक्षणों में अलग फ़ाइल नाम दे। मेरे पास bootstrap.php है जिसके माध्यम से मैं सभी अनुरोध भेजना चाहता हूं। यह परीक्षण फ़ाइल है: .htaccess फ़ाइल पर

<?php 
echo $_GET['requestedURI']; 
?> 

मेरे पास है:

### REWRITE RULES ### 
RewriteEngine on 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .+ bootstrap.php?requestedURI=%{REQUEST_URI} [L] 

का निवेदन http://localhost/test.htm डालता है: /bootstrap.php

अगर मैं बजाय THE_REQUEST डाल REQUEST_URI की .htaccess में मुझे मिलता है /test.htm HTTP/1.1

तो क्यों THE_REQUEST के लिए व्यवस्थित नहीं है? खैर, जैसे ही एक क्वेरी स्ट्रिंग चीजें तोड़ती हैं। अगर मैं अनुरोध करता हूं: http://localhost/test.htm?x=1&y=2 मुझे मिलता है /test.htm?x=1 पहला एम्पर्सेंड चीजें तोड़ता है। मुझे लगता है कि क्वेरीस्ट्रिंग में सभी एम्पर्सेंड को% 26 के साथ प्रतिस्थापित करना संभव है ताकि यह काम करे लेकिन मैंने अब तक प्रबंधन नहीं किया ...

तो क्या कोई बता सकता है कि क्यों REQUEST_URI विफल रहता है और इसे कैसे ठीक किया जाए या कैसे क्वेरी स्ट्रिंग में एम्पर्सेंड को% 26 पर फिर से लिखें?

धन्यवाद।

संपादित करें: उपर्युक्त रिपोर्ट Win 7 पर xampp 1.7.3 पर लागू होती है। मैंने इस दौरान एक उत्पादन लिनक्स सिस्टम पर कोशिश की और REQUEST_URI इसे वापस लौटाता है।

उत्तर

3

आपको अनुरोधित यूआरआई पथ और क्वेरी को स्पष्ट रूप से पास करने की आवश्यकता नहीं है क्योंकि आप PHP में $_SERVER['REQUEST_URI'] के माध्यम से इसे एक्सेस कर सकते हैं। इस प्रकार इस पर्याप्त होना चाहिए:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .+ bootstrap.php 
+0

धन्यवाद, यह एक अच्छा मुद्दा है। मैं ऐसा लगता है कि चीजें अतिसंवेदनशील थीं। फिर भी यह मजाकिया है कि दो सर्वर (जीत/लिनक्स - अगर इसका इसके साथ कुछ लेना है) .htaccess –

+0

@CO में REQUEST_URI पर अलग-अलग व्यवहार करेंगे: * अनुरोध \ _URI * mod_rewrite में हमेशा मूल रूप से अनुरोध किया गया यूआरआई नहीं है लेकिन कर सकता है आपके मामले में पहले से ही एक लिखा होगा जहां ['एल' फ्लैग] (http://httpd.apache.org/docs/current/rewrite/flags.html#flag_l) एक आंतरिक रीडायरेक्ट का कारण बनता है। – Gumbo

2

मैंने थोड़ा सा देखा है, और कोई अच्छा स्पष्टीकरण नहीं मिला है कि %{REQUEST_URI} आपके उदाहरण में ऐसा व्यवहार क्यों करता है। प्राप्त करने के लिए सबसे आम तरीका क्या your're के बाद backreferences हो रहा है:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)$ bootstrap.php?requestedURI=$1 [L] 

संपादित

अपनी टिप्पणी के आधार पर, ऐसा लगता है REQUEST_URI और REQUEST_FILENAME तरह अपडेट किया जाता है और फिर से मूल्यांकन जब RewriteRule शुरू हो रहा है।

+0

मैं ऊपर REQUEST_FILENAME का उल्लेख नहीं था, लेकिन मेरे उदाहरण में इसका उपयोग करने डालता है: डी: /Web_Root/bootstrap.php। आप उस से फ़ाइल नाम निकालते हैं ताकि यह bootstrap.php को बाहर रखे। यह वास्तव में REQUEST_URI का उपयोग करने जैसा ही है। यह "bootstrap.php" डालता है जिसे फ़ाइल मूल रूप से अनुरोधित फ़ाइल के नाम के बजाय पुनर्निर्देशित किया जाता है ... विषम। –

+0

मैंने जो जवाब दिया है उसके साथ मैंने अपना जवाब अपडेट कर लिया है - क्या आपने इसके बजाय बैकरेफर का उपयोग करने का प्रयास किया है? –

+0

मैं इसकी रिपोर्ट कर सकता हूं। कुछ कॉन्फ़िगरेशन में '% {REQUEST_URI} 'को बदला जा रहा है। –

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