2009-02-02 13 views
9

के लिए पुनर्लेखन यूआरएल पुनर्लेखन PHP के लिए $_GET पैरामीटर को कैसे प्रभावित करता है?

कहें कि मेरे पास http://example.com/index.php?p=contact जैसे यूआरएल है और मैं संपर्क पृष्ठ की सेवा के लिए index.php बताने के लिए $_GET['p'] का उपयोग करता हूं। अगर मैं एक पुनर्लेखन नियम का उपयोग करता हूं जो यूआरएल को http://example.com/contact में परिवर्तित करता है, तो क्या $_GET['p'] अभी भी अपेक्षित काम करेगा?

यदि ऐसा होता है, तो क्या आप यह बता सकते हैं कि यह क्यों काम करता है? यदि नहीं, तो समस्या को हल करने के लिए कौन सी रणनीतियों का उपयोग किया जा सकता है ताकि पृष्ठ रीराइट के साथ और बिना दोनों काम करेगा?

+0

अब गंभीरता से, क्या मैं यहां केवल एक ही ध्यान दे रहा हूं कि वह http://example.com/index.php?p=contact को http://example.com/contact में परिवर्तित करने की कोशिश कर रहा है, और नहीं http://example.com/contact http://example.com/index.php?p= यहां पर हर किसी की तरह संपर्क कर रहा है ?? –

+0

मुझे गलत समझा गया कि यह कैसे काम करता है, लेकिन यहां दिए गए उत्तरों ने मेरी समझ को सही करने में मदद की। – VirtuosiMedia

उत्तर

4

हां, यह अपेक्षा के अनुसार काम करेगा।

+0

तो क्या पुनर्लेख केवल ब्राउजर में स्थान पट्टी पर यूआरएल को ओवरराइट करता है लेकिन फिर भी स्क्रिप्ट के लिए अवांछित यूआरएल की सेवा करता है? – VirtuosiMedia

+0

आप www.example.com/page/8 टाइप करते हैं और फिर से लिखते हैं पृष्ठ/8 को देखता है और इसे आपकी php स्क्रिप्ट इसे देखे जाने से पहले index.php? पृष्ठ = 8 में बदल देता है। – Grant

+0

फिर से लिखने के लिए उपयोगकर्ता द्वारा बताए गए यूआरएल को आंतरिक रूप से बदल सकते हैं, या आपके द्वारा उपयोग किए जाने वाले पैरामीटर के आधार पर उसे तुरंत नए यूआरएल पर रीडायरेक्ट कर सकते हैं। यदि आप इसे बताते हैं तो यह किसी अन्य सर्वर से किसी नए पृष्ठ में भी प्रॉक्सी कर सकता है। – Grant

0

आप /contact से /index.php?p=contact पर URL को फिर से लिखते हैं, इसलिए हाँ, यह अपेक्षा के अनुसार काम करेगा।

0

क्या ऐसा नहीं है कि पृष्ठ के हिस्सों को प्रस्तुत करने के बाद हेडर को संशोधित करने से PHP पृष्ठों में स्क्रू अप हो सकता है? आप यूआरएल को फिर से लिख रहे हैं? शायद मैं गलत समझता हूं ...

+0

है, मैंने सोचा कि mod_rewrite या कुछ समान – SilentGhost

+0

के साथ पुनर्लेख एक अपाचे रीराइट नियम के माध्यम से होगा। मुझे इसके बारे में बहुत कुछ पता नहीं है, इसलिए सवाल है, लेकिन मुझे नहीं लगता कि हेडर बिल्कुल छूए हैं। – VirtuosiMedia

+0

क्या आपके लिए जीईटी के बजाय POST का उपयोग करना संभव होगा और फिर अपने वेबडियर में एक उपदिर रूट/संपर्क बनाएं, जिसका अपाचे इंडेक्स सही पृष्ठ पर इंगित करता है? एक अजीब समाधान का क्रमबद्ध करें लेकिन यह दोनों समस्याओं को हल कर सकता है ... –

1

जब एक यूआरएल को फिर से लिखना mod_rewrite द्वारा किया जाता है - अंत में पुनर्प्राप्त पृष्ठ अभी भी "पुराना" है, यानी index.php? P = contact। दूसरे शब्दों में, ब्राउज़र पुनर्प्राप्त/संपर्क करता है। mod_rewrite फिर इसे index.php पर पुनः लिखता है? पी = संपर्क। इस वजह से लिपि, यह नहीं जानता कि कोई भी पुनर्लेखन हुआ - यह अभी भी अपना "सामान्य" तरीका कहलाता है। इसलिए इस तरह की एक पुनर्लेख काम करेगा। हो सकता है कि आप इसे एक पुनर्लेखन प्रॉक्सी के रूप में सोचना चाहें जो मूल ब्राउज़र से अनुरोध किए गए एक अलग पृष्ठ का अनुरोध करता है।

1

जब ग्राहक http://example.com/contact का अनुरोध करता है, तो सर्वर http://example.com/index.php?p=contact की सेवा के लिए पुनर्लेखन नियम का उपयोग करता है। ग्राहक पुनर्लेखित यूआरएल को देखने में सक्षम नहीं होगा और शायद यह भी बताने में सक्षम नहीं होगा कि इसे फिर से लिखा गया था। क्लाइंट के रूप में यूआरएल का अनुरोध करने से आपको वही पृष्ठ मिल जाएगा।

-2

आपके मामले में यह काम नहीं करेगा। mod_rewrite, इसे एक मैच मिलने के बाद और http://example.com/index.php?p=contact से http://example.com/contact पर फिर से लिखता है, एक आंतरिक रीडायरेक्ट करता है। रीडायरेक्ट के बाद भी, नया, पुनर्निर्देशित यूआरआई, अभी भी एक शर्त के खिलाफ मिलान किया जा सकता है और आगे पुनर्निर्देशित किया जा सकता है।

किसी भी मामले में, आने वाले यूआरआई को स्मृति में नहीं रखा जाता है, इसलिए अपाचे भी मूल यूआरआई का पुनर्निर्माण नहीं कर सकता है। PHP, जब तक इसे निष्पादित किया जाता है, मूल यूआरआई भी नहीं जानता है। इसलिए, आप अपने $ _GET वर्र्स को खो देते हैं, क्योंकि GET के माध्यम से भेजे गए चर के रूप में यूआरएल में निहित हैं, जो अब तक, परिवर्तित हो गया है, और PHP आने वाले अनुरोधों को पार्स करके सहयोगी $ _GET सरणी को पॉप्युलेट करता है।

दोनों के लिए समर्थन प्रदान करना दर्दनाक होगा। यदि आपके पास http://domain.com/segment1/segment2/segment3 है तो आपको सेगमेंट को कुछ सार्थक से जोड़ना होगा। आप अपना डोमेन पट्टी करेंगे और '/' पर विस्फोट करेंगे, और आपके मामले में आप कह सकते हैं कि पहला सेगमेंट पृष्ठ का अनुरोध करता है, और http://example.com/contact/ से आप पृष्ठ = 'संपर्क'

+0

यह पुन: लिखने के नियम पर निर्भर करता है। नियम के आधार पर यह या तो आगे के नियमों के लिए अतिसंवेदनशील हो सकता है, या वहां पर रोक सकता है। आप युद्ध प्राप्त कर सकते हैं, लेकिन यह पुनर्लेखन नियमों पर निर्भर करता है, जो VirtuosiMedia ने अभी तक निर्माण शुरू नहीं किया है, इसलिए यह एक महत्वपूर्ण बिंदु है। – Grant

+0

ठीक है, उसके मामले में, http://example.com/index.php?p=contact से http://example.com/contact पर जाकर आपको किसी भी जीईटी वर्रों को पट्टी कर देगी, इसलिए कोई $ _GET ['p' ] काम नहीं करेगा। –

+0

@kron: यह आपको एक स्क्रिप्ट के रूप में पट्टी देगा, साथ ही आपको नहीं लगता? – SilentGhost

31

निकाल सकते हैं मैं अनुदान का जवाब संशोधित करूंगा "हां, यह अधिकतर काम करेगा जैसा कि काम करेगा।"

विशेष रूप से, mod_rewrite मौजूदा क्वेरी स्ट्रिंग्स के संबंध में व्यवहार आश्चर्यजनक हो सकता है।उदाहरण के लिए, के लिए निम्नलिखित नियम है, जो यूआरएल आप आपूर्ति धर्मान्तरित डालें:

RewriteRule /contact /index.php?p=contact 

यह सही ढंग से /contact/index.php?p=contact के लिए और पृष्ठ नाम $_GET['p'] से पहुँचा जा सकेगा पुनर्लेखन होगा। हालांकि, यदि आप इस तकनीक का उपयोग एक स्क्रिप्ट के साथ करते हैं जो पेज नाम के अलावा पैरामीटर का उपयोग करता है, तो यह थोड़ा मुश्किल हो जाता है। यह नियम /contact?person=Joe से /index.php?p=contact का भी अनुवाद करता है। person=Joe पैरामीटर पूरी तरह से गायब हो जाता है! इससे निपटने के दो तरीके हैं।

सबसे आसान तरीका है अपने नियम पर [QSA] ("क्वेरी स्ट्रिंग संलग्न") झंडा उपयोग करने के लिए है, जो शासन में आपूर्ति मापदंडों के बाद मूल क्वेरी स्ट्रिंग स्थापित करेंगे, अनुवाद है /contact?person=Joe/index.php?p=contact&person=Joe रहे हैं:

RewriteRule /contact /index.php?p=contact [QSA] 

हालांकि, यह ओवरराइट करने के लिए आपके p= पैरामीटर के लिए यह संभव बनाता है। /contact?p=about पर जाकर /index.php?p=contact&p=about पर पुनः लिखा जाएगा, इसलिए $_GET['p'] आपकी स्क्रिप्ट में "इसके बारे में" वापस आ जाएगा, न कि "संपर्क"। इस को हल करने के बजाय QUERY_STRING चर का उपयोग:

RewriteRule /contact /index.php?%{QUERY_STRING}&p=contact 

यह गारंटी देता है कि $_GET['p'] होगा हमेशा वापसी "संपर्क" जब इस नियम का उपयोग कर, अपने दर्शकों के अपने यूआरएल के साथ खिलवाड़ कर रहे हैं की परवाह किए बिना। :-)

+0

कुछ बेहतर बिंदुओं को इंगित करने के लिए धन्यवाद – VirtuosiMedia

+1

ठीक है, इस वही चीज़ ने मुझे सप्ताहांत में ऑफ-गार्ड पकड़ा, इसलिए मैंने सोचा कि मैं साझा करूंगा। :-) –

+4

मैं क्वेरी स्ट्रिंग से "संपर्क" शब्द पूरी तरह से लेता हूं: 'रिवाइट्रूल^(। +) $ Index.php/$ 1' का अर्थ है कि "संपर्क" '_SERVER [' PATH_INFO '] में पहुंच योग्य है '$ _GET [' q '] '' के बजाय '। अन्य '$ _GET' पैरामीटर अप्रभावित हैं। – TRiG

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