2012-09-03 18 views
5

मैं की तरह यूआरएल का एक सेट है ....htaccess URL रीराइट निकालें क्वेरी-स्ट्रिंग कुंजी

www.example.com/page/1/name/abc 
www.example.com/city/la/name/abc 
www.example.com/page/1/name/abc/city/la 
www.example.com/page/1/ 

और उन्हें के रूप में परिवर्तित करना चाहते हैं ..

www.example.com/1/abc 
www.example.com/la/abc 
www.example.com/1/abc/la 
www.example.com/1/ 

मूल रूप से मैं कुंजी को छिपाना चाहते हैं क्वेरी स्ट्रिंग से।

यह कैसे करें? कोई मदद?

संपादित

मैं हर पृष्ठ के लिए विभिन्न कुंजी है और वहाँ प्रति पृष्ठ के बारे में 25 चाबियाँ हैं।

+0

यह कुछ हद तक स्पष्ट नहीं है। क्या यह मुद्दा है कि आपने अपने नियंत्रकों से आने वाले रीडायरेक्ट किए हैं जो यूआरएल के पहले सेट की तरह दिखते हैं, और चाहते हैं कि ब्राउज़र केवल यूआरएल की दूसरी सूची प्रदर्शित करे?यदि हां, तो क्या कोई कारण है कि आप अपाचे और mod_rewrite के साथ ऐसा नहीं करना चाहते हैं? – FilmJ

+0

हाँ आप इसे सही कर रहे हैं। और मैंने यह नहीं कहा कि मैं अपाचे और mod_rewrite के साथ ऐसा नहीं करना चाहता हूं। –

+0

आपके उदाहरण यूआरएल से यह लगभग असंभव है, आप कैसे जानेंगे कि किस कुंजी से मूल्य क्या आता है? यदि आप चाबियाँ हटाते हैं, तो वे चले गए हैं। आपको प्रत्येक मान को फिर से हल करने के लिए एक पैटर्न की आवश्यकता होगी –

उत्तर

4

आप Zend_Controller_Router_Route और/या Zend_Controller_Router_Route_Regex का उपयोग करें और मार्गों

$route = new Zend_Controller_Router_Route(
    ':key/:city_name', 
    array(
     'controller' => 'somecontroller', 
     'action'  => 'pageAction' 
    ), 
    array('key' => '^\d+$') 
); 
$router->addRoute('page', $route); // www.example.com/1/abc 

$route = new Zend_Controller_Router_Route(
    ':key/:city_name', 
    array(
     'controller' => 'somecontroller', 
     'action'  => 'cityAction' 
    ), 
    array('key' => '^\d+\w+$') // www.example.com/1a/abc 
); 
$router->addRoute('city', $route); 
+2

जब तक मैं गलत नहीं हूं, यह उसकी समस्या को हल नहीं करेगा, यह है कि वह वास्तव में पहले यूआरएल को फिर से लिखना चाहता है ... हालांकि यह पुनः लिखित यूआरएल की व्याख्या करने का समाधान प्रदान करेगा। – FilmJ

2

फ्रंट कंट्रोलर एक डिज़ाइन पैटर्न है जो यूरी को सिंगल पॉइंट के माध्यम से मैप करता है और ज़ेंड फ्रंट कंट्रोलर पैटर्न का उपयोग कर रहा है। यह मानचित्रांकन bootstrap.php पर बदला जा सकता है। मैंने googled और this questio एन पाया जो काफी समान है।

2

मैं डिफ़ॉल्ट .htaccess बनाए रखता हूं जो सभी अनुरोधों को रूट करता है (आईएमजी, सीएसएस, जेएस, आदि जैसे फ्रंट एंड संसाधनों को छोड़कर) index.php पर। फिर अपने रीडायरेक्ट को संभालने के लिए बूटस्ट्रैप पर routes जोड़ें।

मौजूदा यूआरएल जिन्हें आप नए यूआरएल में बदलना चाहते हैं, के लिए मैं RedirectController को रीडायरेक्ट करता हूं - वास्तव में एक HTTP 301 कोड के साथ रीडायरेक्ट करता हूं, न केवल वही क्रिया करता हूं - आपके वांछित यूआरएल पर।

.htaccess को प्रबंधित करने वाले मार्गों के माध्यम से ऐप-स्तर पर रीडायरेक्ट को लागू करने के खिलाफ एक वैध तर्क है: यह कम प्रदर्शनकारी होगा क्योंकि रीडायरेक्ट करने के लिए पूरे बूटस्ट्रैप/प्रेषण चक्र की आवश्यकता होती है। यह एक उचित तर्क है, लेकिन मुझे यह पता चलता है कि मेरी सभी रूटिंग जानकारी एक ही स्थान पर है, .htaccess और मेरे ऐप-स्तरीय मार्गों दोनों में विभाजित नहीं है।

2

परिभाषित प्रयास करें इस

<IfModule mod_rewrite.c> 
    RewriteEngine on 

    #1 www.example.com/1/abc to www.example.com/page/1/name/abc (/number/string) 
    RewriteRule ^([0-9]+)/([^/]+)$ /page/$1/name/$2 [L,QSA] 

    #2 www.example.com/la/abc to www.example.com/city/la/name/abc (/string/string) 
    RewriteRule ^([^/]+)/([^/]+)$ /city/$1/name/$2 [L,QSA] 

    #3 www.example.com/1/abc/la to www.example.com/page/1/name/abc/city/la (/number/string/string) 
    RewriteRule ^([0-9]+)/([^/]+)/([^/]+)$ /page/$1/name/$2/city/$3 [L,QSA] 

    #4 www.example.com/1/ to www.example.com/page/1/ (/number/) 
    RewriteRule ^([0-9]+)/$ /page/$1/ [L,QSA] 
</IfModule> 

नियम आदेश बहुत महत्वपूर्ण है सकते हैं। कभी मत बदलना। नियम 1 नियम 2 से पहले हमेशा होना चाहिए। नियम 4 हमेशा अंतिम होना चाहिए। ऑर्डर सबसे विशिष्ट नियम से सबसे सामान्य नियम तक है। नियम 3 किसी भी स्थिति में हो सकता है, लेकिन नियम से पहले 4.

0
  1. अपना यूआरएल वर्दी करने का प्रयास करें। फिर साथ काम करना आसान होगा। यहां एक व्यावहारिक उदाहरण है।

.htaccess फ़ाइल:

RewriteEngine on 

# Remove trailing '/' from URL 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} ^(.+[^/])/$ 
RewriteRule ^(.*)/$ /$1 [R=301,L] 

# Convert url to ?q=/US/en/0001 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} ^(.*)$ 
RewriteRule ^(.*)$ index.php?q=%1 [NS,L] 

# Input: /US/en/0001 
# Output print_r($_GET); 
# Array 
# (
# [country] => US 
# [locale] => en 
# [pid] => 0001 
#) 
RewriteCond %{QUERY_STRING} ^q=/([A-Z]{2})/([a-z]{2})/([0-9a-zA-Z]{4})$ 
RewriteRule ^(.*)$ ?country=%1&locale=%2&pid=%3 [NS,L] 

# Input: /US/en 
# Output print_r($_GET); 
# Array 
# (
# [country] => US 
# [locale] => en 
#) 
RewriteCond %{QUERY_STRING} ^q=/([A-Z]{2})/([a-z]{2})$ 
RewriteRule ^(.*)$ ?country=%1&locale=%2 [NS,L] 

# Input: /US 
# Output print_r($_GET); 
# Array 
# (
# [country] => US 
#) 
RewriteCond %{QUERY_STRING} ^q=/([A-Z]{2})$ 
RewriteRule ^(.*)$ ?country=%1 [NS,L] 

index.php

<?php 
    print_r($_GET); 
?> 
संबंधित मुद्दे