2008-12-11 27 views
46

मेरे पास एक वेबसाइट है जहां सभी अनुरोध चुपचाप रीडायरेक्ट किए जाते हैं (.htaccess के माध्यम से) index.php पर और फिर PHP का उपयोग सही पृष्ठ दिखाने के लिए किया जाता है (REQUEST_URI को पार्स करके)।क्या पोस्ट डेटा रीडायरेक्ट करना संभव है?

मैं सोच रहा था कि नकली पते पर पोस्ट डेटा जमा करना संभव है?

मैं वर्तमान में तो जैसे मेरी फार्म मिल गया है ...

<form action="/send-mail" method="post"> 

और मेरे .htaccess नियम ... है

# redirect mail posting to index 
RewriteRule send-mail index.php?send-mail [NC,L] 

मेरे index.php चेकों isset($_GET['send-mail']) जो ठीक काम करता है।

हालांकि यह सभी पोस्ट डेटा को छोड़ना प्रतीत होता है जिसे इसे भेजा जाना चाहिए।

क्या पोस्ट डेटा रखने का कोई तरीका है? मैं जीईटी का उपयोग नहीं करना चाहता क्योंकि यह अधिक जानकारी नहीं भेज सकता है, हालांकि यह एक साधारण पूछताछ फ़ॉर्म के साथ कोई मुद्दा नहीं हो सकता है।

यहाँ index.php

# serve files and dirs if they exist please, otherwise send to index 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule . index.php 

उत्तर

56

के लिए पुनः निर्देशित प्रयास करें के लिए मेरे .htaccess है इस:

# redirect mail posting to index 
    RewriteRule send-mail index.php?send-mail [NC,P] 

"पी" "L" की तरह है कि यह प्रोसेसिंग नियमों बंद हो जाता है लेकिन यह भी मॉड्यूल बताता कृत्यों कि अनुरोध प्रॉक्सी मॉड्यूल को बरकरार रखा जाना चाहिए (जिसका अर्थ है POST डेटा संरक्षित है)।

+14

ध्यान दें कि आप प्रॉक्सी मॉड्यूल सक्षम करने की आवश्यकता है, और काम करने के लिए कॉन्फ़िगरेशन फ़ाइलों में proxy_http_module। साथ ही, आपको पुनः लिखने के नियम के लिए पूर्ण पथ सेट करने की आवश्यकता हो सकती है। यही है, उपर्युक्त उदाहरण में, आप 'रिवाइटरूल भेजें-मेल/पैथ /to/index/index.php?send-mail [एनसी, पी] '(या सूचकांक से पहले कम से कम'/'पर) का उपयोग करेंगे – Marius

+0

उत्कृष्ट ने मुझे धन्यवाद दिया! – Petrogad

+1

यदि आप होस्ट हेडर को संरक्षित करना चाहते हैं, तो आप अपाचे कॉन्फ़िगरेशन में 'ProxyPreserveHost On' को भी सक्षम करना चाहते हैं। –

1

जब तक आप केवल एक आंतरिक पुनर्लेख का उपयोग नहीं कर रहे हैं, एक HTTP रीडायरेक्ट नहीं, तो आपको POST डेटा खोना नहीं चाहिए। यहाँ नियम मैं अपनी साइट पर उपयोग करते हैं:

RewriteRule ^(.*)$ index.php/$1 [L] 

फ़ायरफ़ॉक्स (या कुछ इसी तरह) के लिए HTTPLiveHeaders एक्सटेंशन का उपयोग कर की कोशिश करो और पूरे पृष्ठ अनुरोध को ट्रैक। सुनिश्चित करें कि आपको HTTP रीडायरेक्ट नहीं मिल रहा है। यदि आपको HTTP/1.1 3xx प्रतिक्रिया और स्थान: http://address हेडर, यह समस्या है। आपके द्वारा पोस्ट किए गए आपके पुनर्लेखन नियम को ऐसा नहीं होना चाहिए। यदि आपको रीडायरेक्ट किया जा रहा है, तो शायद आपके PHP कोड में कोई त्रुटि हो सकती है या कोई अन्य पुनर्लेखन नियम लागू किया जा रहा है।

+0

नहीं, मैं 200 वापस प्राप्त कर रहा हूं ठीक है: एस – alex

+0

ऐसा लगता है कि ब्राउजर रीडायरेक्ट होने के बाद दूसरे अनुरोध के लिए 'GET' का उपयोग करेगा ... –

+0

पुनर्लेखन के साथ कोई दूसरा अनुरोध नहीं है। केवल एक रीडायरेक्ट (स्थान शीर्षलेख और 3xx प्रतिक्रिया) का दूसरा अनुरोध है। – mcrumley

7

आपको बस index.php पर रीडायरेक्ट करने में सक्षम होना चाहिए, और उसके बाद उस स्क्रिप्ट में, "प्रेषण" के साथ मूल अनुरोध देखने के लिए $_SERVER['REQUEST_URI'] तक पहुंचने में सक्षम होना चाहिए।

वैसे, "अधिक जानकारी नहीं भेज सकता" पोस्ट का उपयोग करने का कारण नहीं है। POST का उपयोग करने का कारण यह है कि अनुरोध डेटा को पुनर्प्राप्त करने के बजाय, आपकी साइट पर डेटा को संशोधित करेगा।

मान लीजिए कि आप अपने पृष्ठ पर "/delete_user?id=1234" जैसे जीईटी अनुरोध के साथ एक हाइपरलिंक डालते हैं, और फिर कुछ खोज इंजन लिंक का अनुसरण करते हैं क्योंकि यह आपकी साइट को अनुक्रमणित करता है। यही कारण है कि डेटा अनुरोध संशोधित करने के अनुरोध प्राप्त करने के लिए अनुरोध अच्छे नहीं हैं।

+3

उसमें एक छोटी सी सीमा है, एक बार जब आप कुछ मनमानी सीमा (मुझे लगता है कि इसके 1024 वर्ण) हैं, तो डेटा के बाद अनुरोध से छीन लिया जाता है। यदि उपयोगकर्ता इनपुट फ़ील्ड होता है तो विशेष रूप से समस्याग्रस्त। –

+3

(एनबी: सीमा सर्वर * और * ब्राउज़र विशिष्ट है, आरएफसी का कहना है कि यह असंबद्ध है, लेकिन हम जानते हैं कि कितनी बार कुछ कंपनियां इसे पढ़ती हैं) –

+3

+1 मैं थोड़ा और प्रबुद्ध हूं क्योंकि मैंने इस सवाल से पूछा और अब पूरी तरह से सभी संशोधन को समझते हैं डेटा पोस्ट होना चाहिए – alex

0

मैं उपयोगकर्ता_login.php को पोस्ट फॉर्म डेटा के साथ दोस्ताना यूआरएल जैसे/उपयोगकर्ता-लॉगिन को रीडायरेक्ट करना चाहता हूं और यह मेरे लिए काम करता है।

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/user_login\.php [NC] 
RewriteRule^user-login [QSA,R=301] 
RewriteRule ^user-login$ user_login.php [QSA,L] 

दृश्य फ़ाइल में

<form action="<?php $siteurl;?>/user-login" method="post" id="user_login"> 
1

कुछ प्रॉक्सी की समस्याओं से बचने के लिए और अपाचे पुनर्लेखन करता है, POST डेटा में पास या एक खाली शरीर के साथ अनुरोधों के लिए Content-Length: 0 हैडर निर्धारित किया है।

मुझे हाल ही में अपाचे के साथ GET पर अपने अनुरोध को बदलने के लिए एक खाली निकाय के साथ POST कर रहा था। तो, यह करने के बजाय:

curl -X POST https://example.com/api/user/123456789 

Content-Length हैडर पारित:

curl -X POST https://example.com/api/user/123456789 -H 'Content-Length: 0' 

या शरीर में कुछ पारित:

curl -X POST https://example.com/api/user/123456789 -d '' 
संबंधित मुद्दे