2012-06-05 9 views
6

परिवर्तन नहीं करता है मैं जानता हूँ कि यह एक बहुत ही आम सवाल है, लेकिन मैं इस सवाल का जवाबphp पुनर्निर्देश url

I'v एक post.php, कि एक पोस्ट प्रपत्र सबमिट जब controller.php को नहीं पा सके यह सही हो जाता है, नियंत्रक में यह करता है:

header("Location: ./post?ok=1"); 

पोस्ट वास्तव में डाला जाता है, और यह रेखा से ऊपर, लेकिन ब्राउज़र में यूआरएल लगता है कभी नहीं बदल माध्यम से चला जाता है, और अंत में ठीक नहीं है परम,

मैं सत्र परिवर्तक का उपयोग कर सकता हूं ई इस तरह के एक सफलता/असफलता परम है, लेकिन इस तरह से काम करना चाहिए

post.php:

<form action="controller" method="post"> 
    <input name="test" value='test' type="text" /> 
    <input type="submit" value="post" /> 
</form> 

controller.php:

<?php 
    header("Location: ./post?ok=1"); 
?> 

संपादित करें 1:

header("Refresh:1;url=http://localhost/test/post?ok=1"); //doesn't work better 

संपादित करें 2:

post.php शीर्ष में मैं

debug("post l ".count($_POST)); 
debug("get l ".count($_GET)); 

रख दिया है वे 0 के पहले प्रस्तुत दिखाने के लिए, और 0 के भी edit3 के बाद

: यह

काम करता है द्वारा अवरोधित की गई:

if ($success){ 
    header("Location: ./post?ok=1"); 
} 
header("Location: ./post"); 

कि होना चाहिए:

if ($success){ 
    header("Location: ./post?ok=1"); 
} else { 
    header("Location: ./post"); 
} 

THX सभी

+1

मुझे लगता है कि आपने फ़ॉर्म टैग के क्रिया को सही तरीके से नहीं दिया है ... यह

आपने फ़ाइल का विस्तार याद किया है। –

+0

क्या आप सुनिश्चित हैं कि हेड फ़ंक्शन निष्पादित है? – xdazz

+0

हाँ मैंने एक डीबग ('टेस्ट') रखा है –

उत्तर

3

सबसे पहले आप $_SERVER['HTTP_REFERER'] उपयोग नहीं करना चाहिए यह असुरक्षित है के बाद किसी भी सफेद स्थान और अतिरिक्त लाइन सुनिश्चित करें। यह भी संभव है कि ग्राहक इस हेडर को वैसे भी नहीं भेजेगा। अभी मुझे नहीं पता कि कैसे, लेकिन मुझे यकीन है कि इसका उपयोग कुछ बुराई के लिए आपकी साइट को हाइजैक करने के लिए किया जा सकता है।

बेहतर आपको पता होना चाहिए कि फ़ॉर्म डेटा कहां से आया था और उपयोगकर्ता को वहां वापस रीडायरेक्ट किया गया था।

जिस तरह से आपका रीडायरेक्ट संभवतः काम की तरह काम नहीं करता है क्योंकि यूआरएल में पहले से ही एक प्रश्न चिह्न है। तो आपको & साइन के साथ और पैरामीटर जोड़ना होगा।

रीडायरेक्ट के लिए मैं HTTP 302 Found प्रतिक्रिया स्थिति का सुझाव दूंगा। लेकिन आपको यह सुनिश्चित करना होगा कि कुछ भी पहले बाहर नहीं भेजता है। इस निम्नलिखित header लाइन से पहले कोई HTML आउटपुट या खाली लाइनों होना चाहिए:

header("Location: http://".$_SERVER['HTTP_HOST']."/your/source.form", true, 302); 
+0

मैंने हेडर रखा है ("स्थान: ./post?ok") ; और बेहतर काम नहीं कर रहे, प्रश्न –

+0

संपादित किया गया रीडायरेक्ट में पूर्ण यूआरएल रिलेटिव यूआरएल का उपयोग करना बेहतर है * बुरा * वहां ब्राउज़र को स्रोत और गंतव्य यूआरएल से भ्रमित किया जा सकता है। किस यूआरएल पर रीडायरेक्ट से संबंधित होना चाहिए? – rekire

+0

मैंने हेडर की कोशिश की है ("स्थान: http: // localhost/test/post? Ok = 1"); और हेडर ("ताज़ा करें: 0; यूआरएल = http: // लोकलहोस्ट/टेस्ट/पोस्ट? ठीक = 1"); अभी तक काम नहीं कर रहा है –

3

HTTP स्थिति कोड 303 oter देखें उपयोग करके देखें:

header("Location: your/location", true, 303); 
+0

दुर्भाग्यवश यह वही है –

1

वहाँ सर्वर साइड पर कुछ समस्याओं का हो सकता है (उदाहरण के लिए हेडर सेट करने से पहले आपका कोड कुछ प्रिंट करता है)। इसे डीबग करने के लिए, आपको display_errors = On को अपने php.ini में सेट करना होगा या ini_set('display_errors', 1) के साथ अस्थायी रूप से इसे अपने कोड में सक्षम करना होगा।

ज्यादातर मामलों में, त्रुटि "Cannot modify header information - headers already sent." है। कोई print, echo या PHP अंतिम टैग (?>)

+0

मुझे इन त्रुटियों को नहीं मिला, और नियंत्रक किसी भी एचटीएमएल को प्रतिबिंबित नहीं कर रहा है या कुछ भी php_curl कॉल और हेडर() रीडायरेक्ट –

1

सर्वर द्वारा एक दूसरे रीडायरेक्ट की एक समस्या यह कर सकता है। यूआरएल को विस्तार .php जोड़ने

header('Location: post.php?ok=1', true, 303); 
exit; 

कोशिश करने के लिए सुनिश्चित करने के लिए, कि पोस्ट? ठीक = 1post.php करने के लिए सर्वर से पुन: निर्देशित नहीं है (उदाहरण के लिए htaccess)। अतिरिक्त रीडायरेक्ट में आप प्राप्त पैरामीटर खो सकते हैं। फिर हेडर रीडायरेक्ट के बाद बाहर निकलने के लिए मत भूलना।

0

असल में ... ऐसा प्रतीत होता है कि आप "बाहर निकलने" के साथ हेडर() कॉल का पालन नहीं कर रहे हैं। उदाहरण:

header('location: ' . $location); exit; 

header('location: ' . $location, true, 301); exit; 

कॉल के बाद आप 'प्रस्थान', यूआरएल ब्राउज़र पता पट्टी में बदल जाता है जब क्योंकि कोड निष्पादित करने के लिए जारी रखने से रोका जाता है। अन्यथा, कोड निष्पादित जारी रहता है जिसके कारण यूआरएल अपरिवर्तित रहता है।