अनुरोध यूआरआई से संस्करण उपसर्ग को कैसे हटाएं और सही दस्तावेज़ रूट का उपयोग करें?

हमें वेब सेवा के कुछ प्रमुख और मामूली संस्करणों का समर्थन करने की आवश्यकता है, इसलिए हम इस तरह के यूआरएल में संस्करण का उपयोग करने का फैसला करते हैं:

http://service/      # last deployed version of service
http://service/1/    # symlink that points to the last deployed major version 1.x
http://service/1.2/  # symlink that points to the last deployed minor version 1.2.x

हम सभी टैग फ़ोल्डर्स में स्टोर करते हैं और सिमलिंक को सही संस्करणों में बनाते हैं:

Here the root directory for apache:
lrwxr-xr-x   1 xxxx xxxx 28 May 23 15:21 1 -> /home/site/tags/20120523084844-HEAD
lrwxr-xr-x   1 xxxx xxxx 28 Apr 27 15:21 1.1 -> /home/site/tags/20120427152123-HEAD
lrwxr-xr-x   1 xxxx xxxx 28 May 23 08:48 1.2 -> /home/site/tags/20120523084844-HEAD
lrwxr-xr-x   1 xxxx xxxx 28 May 24 16:12 2 -> /home/site/tags/20120524161232-HEAD
(source code here for last deployed version)
.....

यहां एक समस्या है, क्योंकि हमारे पास PHP में REQUEST_URI में संस्करण उपसर्ग होगा और सिम्फनी राउटर पैटर्न के खिलाफ मेल नहीं खाएगा। हम उस संस्करण उपसर्ग को कैसे हटा सकते हैं, लेकिन फिर भी विशिष्ट निर्देशिका का उपयोग दस्तावेज़ रूट के रूप में करते हैं?

उदाहरण के लिए, जब हम http: //service/1.2/some/handler/pattern से अनुरोध करते हैं तो 1.2 निर्देशिका से कोड का उपयोग किया जाएगा और PHP में REQUEST_URI/कुछ/हैंडलर/पैटर्न

3
जोड़ा
विचारों: 2
मैं स्रोत कोड में एक संस्करण पैटर्न नहीं जोड़ना चाहता, क्योंकि सेवा की प्रत्येक स्थापना को यूआरआई में संस्करण के बारे में पता नहीं होना चाहिए।
जोड़ा लेखक lisachenko, स्रोत
राउटिंग पैटर्न/सेवा /: संस्करण/कुछ/हैंडलर/पैटर्न (सिम्फनी 1) या/सेवा/{संस्करण}/कुछ/हैंडलर/पैटर्न (सिम्फनी 2) काम नहीं करता है?
जोड़ा लेखक Pierre, स्रोत

2 उत्तर

इसे इस्तेमाल करे:

RewriteEngine On
RewriteBase /

RewriteCond $1 !^[0-9.]+/
RewriteRule ^(.*) /1.2/$1 [L]

एकमात्र विचार यह है कि आप एक समय में केवल संस्करण का परीक्षण कर सकते हैं, और यदि आप एक अलग चाहते हैं तो htaccess को बदलना होगा।

क्या मैं संस्करण के लिए सबडोमेन का उपयोग करने का सुझाव दे सकता हूं?

1
जोड़ा
उत्तर के लिए धन्यवाद! दुर्भाग्यवश, हमें एक समय में कई संस्करणों का समर्थन करने की आवश्यकता है। मैंने वर्चुअल सबडोमेन और अपाचे के साथ पारदर्शी रिवर्स-प्रॉक्सीइंग के बारे में पहले ही सोचा है। लेकिन उत्पादन वातावरण में उपयोग करने के लिए यह बहुत जटिल होगा।
जोड़ा लेखक lisachenko, स्रोत

यह एक दिलचस्प समस्या है।

मुझे नहीं लगता कि यह केवल htaccess के साथ किया जा सकता है, कम से कम बदसूरत हैक के बिना नहीं। REQUEST_URI हमेशा मूल अनुरोध रखता है, और जहां तक ​​मुझे पता है कि इसे संपादित करने का कोई तरीका नहीं है (यदि हम वैरिएबल REQUEST_URI को E = REQUEST_URI = "कुछ" के माध्यम से सामग्री असाइन करने का प्रयास करते हैं, तो "REDIRECT_REQUEST_URI" नामक एक पर्यावरणीय चर बनाया जाएगा )।

मैं सिम्फनी से परिचित नहीं हूं, इसलिए मुझे नहीं पता कि रूटिंग को संभालने वाली स्क्रिप्ट को संपादित करना कितना आसान है। यदि यह आसान है, तो आप कुछ ऐसा कर सकते हैं

RewriteRule ^[1-9.]/(.*)$ - [R,QSA,NC,E=HANDLER:$1]

फिर PHP में आप हैंडलर को request_uri पर कॉपी कर सकते हैं:

$_SERVER['REQUEST_URI'] = $_SERVER['REDIRECT_HANDLER'];

इस तरह PHP को बदलने के अलावा, मैं केवल इसके बारे में सोच सकता हूं: पहले हैंडलर को हार्ड-रीडायरेक्ट करें, क्वेरी स्ट्रिंग में संस्करण जानकारी डालें। फिर उस अनुरोध को पकड़ें, और संस्करण/हैंडलर पर सॉफ्ट-रीडायरेक्ट करें। Request_uri सही ढंग से सेट किया जाएगा, लेकिन यह बदसूरत और बहुत अधिक त्रुटि-प्रवण है।

उस ने कहा, मैं वर्जनिंग के लिए सबडोमेन का उपयोग करने के बारे में Gerben से पूरी तरह से सहमत हूं।

1
जोड़ा
हां, ऐसा लगता है कि कोई सुरुचिपूर्ण समाधान नहीं है। प्रॉक्सिंग के साथ केवल उपडोमेन। यह दयालु है, लेकिन मैं कोड स्तर पर एक हैक रखूंगा (
जोड़ा लेखक lisachenko, स्रोत