2013-01-10 13 views
6

का उपयोग करते समय सही ढंग से एक यूआरएल एन्कोड करना मैं एक mod_rewrite और Akelos फ्रेमवर्क से निकाली गई एक रूटिंग प्रणाली का उपयोग कर रहा हूं।रीराइट इंजन

मुझे खोज कुंजी पैरामीटर में कुछ प्रतीकों का उपयोग करते समय एक बहुत बड़ी समस्या है।

एक मार्ग नक्शा पीछा कर रहा है:

$map->connect(":lang/search/:string", array('controller' => 'search','action' => 'index')); 

नियंत्रक में अब मैं एक खोज कीवर्ड के रूप में $this->registry->map['params']['get']['string'] मिलता है।

मुझे यूआरएल को सही तरीके से एन्कोड करने का कोई तरीका नहीं मिल रहा है। उदाहरण के लिए के एक स्ट्रिंग ले t\ /#%&=

urlencode() देता t%5C+%2F%23%25%26%3D और पृष्ठ प्रदर्शित करता है The requested URL /site/en/search/t\+/#%&= was not found on this server.

rawurlencode()t%5C%20%2F%23%25%26%3D देता है और पेज एक ही प्रदर्शित करता है करते हैं।

आप डाउनलोड या एक रूटर वर्ग स्रोत here on this page

मैं वास्तव में यूआरएल और इस तरह के एनकोडिंग है जिसके द्वारा आप कुछ भी नहीं पढ़ सकते हैं के लिए बेस 64 उपयोग करने के लिए नहीं करना चाहते हैं देख सकते हैं।

मामले में अगर तुम यहाँ की जरूरत है एक .htaccess फ़ाइल की सामग्री के रूप में अच्छी तरह से है:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 
</IfModule> 

अद्यतन

Here are actually working files for making tests.

यदि आपके पास समय है आपके सर्वर पर इन फ़ाइलों और परीक्षण डाउनलोड करें ।

गाइड:

controllerclass.php - सरल नियंत्रक ढांचे, उस में एक वर्ग "नियंत्रक" को परिभाषित करते हुए काम करने के लिए सक्षम बनाता है searchcontroller.php

routerclass.php - एक रूटर वर्ग Akelos फ्रेमवर्क से निकाला, बग शायद है वहाँ

routes.php - एक जगह है जहाँ आप अपने routs परिभाषित, हमारे मामले में हम केवल /search/:string

है

searchcontroller.php - तार परीक्षण करने के लिए एक बुनियादी आवेदन -/इस फाइल

index.php करने के लिए खोज/stringhere अंक - मुझे नहीं लगता कि एक त्रुटि यहाँ है

है - कहाँ सभी दीक्षा और मार्ग शुरू करने के लिए

.htaccess होता है

मुझे लगता है कि आप index.php में परिवर्तन करने के लिए, controllerclass.php, routes.php की जरूरत नहीं होगी, searchcontroller.php

एक बग शायदमें हैया शायद .htaccess में कुछ फ़िक्स आवश्यक है जो मुझे विश्वास नहीं है।

+1

'बी' और' एनई 'झंडे जोड़ने का प्रयास करें, प्रत्येक अकेले और संयुक्त। –

+0

वही, परिणाम नहीं दिया। – Davit

+0

मैं दूसरा बस बी ध्वज जोड़ रहा हूं, इसलिए '[क्यूएसए, एल, बी]' – Gerben

उत्तर

1

दिया त्रुटि है:

"अनुरोधित URL/साइट/en/खोज /"

आप अतिरिक्त शब्द 'साइट' उस में जो उल्लेखित नहीं है आपके प्रश्न में, जो हस्तक्षेप करना मुश्किल बनाता है, लेकिन त्रुटि अपाचे PHP से आ रही है।

त्रुटि कहती है कि यूआरएल आपके एचटीएसीएएस नियमों से मेल नहीं खा रहे हैं। तो त्रुटि को समझने के लिए आपको किसी भी PHP कोड के अंदर देखने की आवश्यकता नहीं है, त्रुटि कहीं अपाचे में है।

Searching further - ऐसा इसलिए है क्योंकि यूआरएल मान्य नहीं है। क्वेरी स्ट्रिंग में% 2f की अनुमति है लेकिन पथ में नहीं। चूंकि यह अमान्य है क्योंकि सर्वर फिर से लिखने के नियमों को हिट करने से पहले इसे अस्वीकार कर रहा है।

www.jampmark.com का लिंक 5 समाधान लाभ और उन समाधानों के साथ मुद्दों को देता है लेकिन यह उस सामग्री को कॉपी करने के लिए अनुचित होगा।

  1. अपाचे में "AllowEncodedSlashes" निर्देश चालू
  2. यूआरएल एन्कोडिंग के बाद% 255C के साथ% और% 252F के साथ 2F% 5C बदलें
  3. डबल urlencode()
  4. उपयोग unencoded स्लैश
  5. बदलें स्लैश

    : अंडरस्कोर (_)

इसके अलावा के साथ, वहाँ पर अपने परीक्षण कोड में कोई त्रुटि है

$string[2] = "t\ /#%&="; 

स्लैश-स्पेस एक वैध भागने का अनुक्रम नहीं है। आपको या तो कोड को "t \\/#% & =" में बदलना चाहिए; बैकस्लैश को बचने के चरित्र के रूप में व्याख्या करने से बचने के लिए।

+0

मैं वास्तव में इकट्ठा हुआ और इन फ़ाइलों को अपने असली एप्लिकेशन के बाहर परीक्षण के लिए एक साथ रख दिया। और 'lang/search /: string' असली वेबसाइट पर मेरा मामला है जिसका फाइलों के साथ कुछ लेना देना नहीं है। – Davit

+0

हां, मैंने पहले इसके बारे में पढ़ा है और इससे मदद नहीं मिली है। मैं अंडरस्कोर के साथ स्लेश को प्रतिस्थापित नहीं करना चाहता हूं। मैं mod_rewrite के बिना अपना आवेदन काम कर सकता हूं लेकिन यूआरएल उलझन में हैं। मुझे लगता है कि routerclass.php में त्रुटि है क्योंकि मैं अपने वर्तमान अपाचे कॉन्फ़िगरेशन का उपयोग कर एक एप्लीकेशन लिख सकता हूं जो पूरी तरह से काम करने के लिए यूआरएल में स्लैश और अन्य वर्ण जैसे नंबर साइन (#) बना देगा। धन्यवाद। – Davit

+0

क्या आप उन यूआरएल को दिखा सकते हैं जो उन में स्लेश हैं जो आपको लगता है कि काम कर रहे हैं? आपके उदाहरण में यह स्लैश के साथ था जो काम करने में असफल रहा - जो ठीक है जैसा कि अपाचे को स्लेश पसंद नहीं है। – Danack

2

ऐसा लगता है कि यह समस्या RFC 3986 Section 7.3 (Back-End Transcoding)urlencode और urldecode के बारे में है।

function myUrlEncode($string) { 
    $entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%5C', '%3F', '%25', '%23', '%5B', '%5D'); 
    $replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "\\", "?", "%", "#", "[", "]"); 
    return htmlspecialchars(str_replace($entities, $replacements, urlencode($string))); 
} 

नोट %5C =>\ और htmlspecialchars() (htmlspecialchars के अलावा बल्कि विशेष वर्णों का उपयोग करने के लिए इनपुट हो सकता है <script>... या <h1>... आदि सक्षम किया जा रहा से सुरक्षा के बारे में है। मैं थोड़ा http://php.net/manual/en/function.urlencode.php#97969 पर समारोह संशोधित कर लिया है:))।

तो आप इसे पसंद का उपयोग कर जाएगा:

print("<b><i>URL Encode Tests</i></b><br /><br /> 
    <b>Works:</b> ".myUrlEncode($string[0])." <a href=\"".HTTP_ROOT."/search/".myUrlEncode($string[0])."\">/search/".myUrlEncode($string[0])."</a><br /> 
    <b>Does not work:</b> ".myUrlEncode($string[1])." <a href=\"".HTTP_ROOT."/search/".myUrlEncode($string[1])."\">/search/".myUrlEncode($string[1])."</a><br /> 
    <b>Does not work:</b> ".myUrlEncode($string[2])." <a href=\"".HTTP_ROOT."/search/".myUrlEncode($string[2])."\">/search/".myUrlEncode($string[2])."</a><br /> 
"); 

कि करने के बाद, खोज स्ट्रिंग # 3 (\ /#%&=) "विधि SearchController की तरह एक PHP त्रुटि देता है :: टी में अमान्य है ... लाइन 30 पर \ index.php "। मुझे लगता है कि यह राउटर में रेगेक्स के बारे में है, इसलिए आपको वहां कुछ समायोजन करने की आवश्यकता हो सकती है।

+0

ध्यान दें कि यदि आप खोज क्वेरी का उपयोग यूआरएल पैरामीटर के रूप में करते हैं, तो नियमित रूप से नियमित 'urlencode' के साथ सबकुछ सामान्य रूप से काम करता है। '/ search /? q = ...' –

+0

"खोज स्ट्रिंग # 3 (\/#% & =) एक PHP त्रुटि देता है" - वह स्ट्रिंग मान्य नहीं है क्योंकि यह डबल-कोट्स में संलग्न है, और इसलिए स्लैश स्पेस एक अपरिचित बचने का अनुक्रम है। – Danack

+0

@ डैनैक, चूंकि त्रुटि नियंत्रक में पकड़ी जाती है, और ओपी उन पात्रों को पकड़ना चाहता है, मुझे लगता है कि राउटर रेगेक्स में समायोजन से इन्हें वर्णों की विस्तृत श्रृंखला की अनुमति मिल जाएगी। –

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