2008-11-22 9 views
13

तोड़ने मैं एक यूआरएल स्ट्रिंग है कि इस तरह काम करता है बनाने के लिए कोशिश कर रहा हूँ स्लैश:यूआरएल आगे इनकोडिंग मेरी CodeIgniter एप्लिकेशन

/app/process/example.com/index.html 
तो दूसरे शब्दों में

,

/app/process/$URL 

मैं तो साथ url प्राप्त

$this->uri->segment(3); 

यूआरएल में आगे की धड़कन निश्चित रूप से यूरी सेगमेंट तक पहुंचने में एक समस्या होगी, इसलिए मैं अहीया जाऊंगा घ और यूआरएल URL भाग सांकेतिक शब्दों में बदलना:

/app/process/example.com%2Findex.html 

.. लेकिन अब मैं सिर्फ कह 404 मिलता है ...

Not Found 

The requested URL /app/process/example.com/index.html was not found on this server. 

ऐसा लगता है कि आगे की मेरी यूआरएल एन्कोडिंग टूटता स्लैश सीआई के यूआरआई पार्सर।

इस समस्या को हल करने के लिए मैं क्या कर सकता हूं?

उत्तर

0

कोडइग्निटर के साथ, यूआरएल का पथ नियंत्रक से मेल खाता है, नियंत्रक में एक फ़ंक्शन, और फ़ंक्शन के पैरामीटर।

आपका यूआरएल, /app/process/example.com/index.html, app.php नियंत्रक, प्रक्रिया समारोह के अंदर, और दो पैरामीटर example.com और index.html के अनुरूप होगा:

<?php 
class App extends Controller { 
    function process($a, $b) { 
     // at this point $a is "example.com" and $b is "index.html" 
    } 
} 
?> 

संपादित करें: अपने प्रश्न को दोबारा पढ़ने में, ऐसा लगता है कि आप यूआरएल के दूसरे URL के रूप में व्याख्या करना चाहते हैं। ऐसा करने के लिए, आपको तर्कों की एक चर संख्या लेने के लिए अपना फ़ंक्शन लिखना होगा। ऐसा करने के लिए, आप कार्यों func_num_args और func_get_arg इस प्रकार के रूप में उपयोग कर सकते हैं:

<?php 
class App extends Controller { 
    function process() { 
     $url = ""; 
     for ($i = 0; $i < func_num_args(); $i++) { 
      $url .= func_get_arg($i) . "/"; 
     } 

     // $url is now the url in the address 
    } 
} 
?> 
9

मुझे लगता है कि आप हो रही है त्रुटि संदेश CodeIgniter से लेकिन अपने वेब सर्वर से नहीं है।

मैंने कोडइग्निटर का उपयोग किए बिना अपाचे 2 का उपयोग करके इसे दोहराया: मैंने एक फ़ाइल index.php बनाया, और फिर index.php/a/b/c तक पहुंच गया - यह ठीक काम करता था। अगर मैंने index.php/a/b/c%2F तक पहुंचने का प्रयास किया तो मुझे अपाचे से 404 मिल गया।

मैं अपने अपाचे विन्यास को जोड़कर इसे हल:

AllowEncodedSlashes On

अधिक जानकारी

के लिए the documentation देखें कर लेने के बाद यह आप CodeIgniter में $config['permitted_uri_chars'] साथ बेला के आसपास की आवश्यकता हो सकती है अगर यह अभी भी काम नहीं कर रहा है - आपको लगता है कि स्लैश

+1

यह सही है। हालांकि जब भी तय किया जाता है तो आपको समस्याएं आ सकती हैं, क्योंकि सीजीआई मानक जो PATH_INFO को परिभाषित करता है, स्ट्रिंग को यूआरएल-डिकोडिंग के एक दौर से गुजरना पड़ता है, जो स्लैश तोड़ सकता है। केवल अपाचे पर, आप REQUEST_URI का उपयोग कर सकते हैं, जो इससे पीड़ित नहीं है ... डुनो अगर सीआई इसका उपयोग कर सकता है। – bobince

+3

मैंने अभी साइट पर इस समस्या को ठीक किया है। यह एक हैक का एक सा है, लेकिन यह काम पूरा हो गया: मैं यूआरएल urlencoded डबल। इस तरह REQUEST_URI का urldecode/बहुत जल्दी वापस नहीं करता है। –

+0

असल में, आप जो चाहते हैं वह संभवतः 'AllowEncodedSlashes NoDecode' – celwell

4

इस समस्या को हल करने का एक तरीका आपके यू में किसी भी आगे की स्लैश को प्रतिस्थापित करना होगा आरएल वैरिएबल जो आप यूआरआई सेगमेंट में कुछ ऐसा कर रहे हैं जो कोडइग्निटर यूआरआई पार्सर को तोड़ नहीं देगा। उदाहरण के लिए:


$uri = 'example.com/index.html'; 
$pattern = '"/"'; 
$new_uri = preg_replace($pattern, '_', $uri); 

यह अंडरस्कोर के साथ आपके सभी आगे की स्लैश को प्रतिस्थापित करेगा। मुझे यकीन है कि यह आपके आगे की स्लैश को एन्कोड करने के लिए आप जो कर रहे हैं उसके समान है।


$pattern = '/_/'; 
$old_uri = preg_replace($pattern, '/', $new_uri); 

आगे के साथ अपने पुराने URI वापस पाने के लिए स्लैश कौन सा सब अंडरस्कोर का स्थान ले लेगा: फिर जब अन्य पृष्ठ पर मूल्य पुन: प्राप्त करने के लिए बस निम्नलिखित की तरह कुछ का उपयोग करें। बेशक, आप यह सुनिश्चित करना चाहते हैं कि आप जो भी चरित्र उपयोग करते हैं (इस मामले में अंडरस्कोर) आपके द्वारा पारित होने वाले संभावित यूआरआई में मौजूद नहीं होगा (इसलिए आप शायद अंडरस्कोर का उपयोग नहीं करना चाहेंगे)।

0

कॉन्फ़िग फ़ाइल में अपने permitted_uri_chars सूचकांक बदलें

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';