2013-02-22 77 views
5

सबमिट करते समय त्रुटि का कारण बनता है मैं अपनी साइट पर यूआरएल के लेआउट को कॉन्फ़िगर करने के लिए अपने htaccess-file के साथ काम करता हूं।htaccess rewrite नियम फॉर्म

फिलहाल समस्या यह है कि मैं अब कोई फॉर्म नहीं भेज सकता।

मेरे पास दो फाइलें हैं जिनमें वास्तव में एक ही कोड होगा (प्रति नाम बदलें)। अगर मैं page1.php पर कॉल करता हूं तो यूआरएल page1.php के रूप में प्रदर्शित किया जाएगा। सब कुछ ठीक काम करता है जबकि मैं लॉगिन करने की कोशिश करता हूं या कुछ त्रुटियों का कारण बनता हूं। अब जब मैं index.php पर कॉल करूंगा (जिसमें एक ही कोड है!) htaccess यूआरएल में index.php छुपाता है जैसा कि करना चाहिए! लेकिन जब मैं लॉगिन स्क्रिप्ट का परीक्षण करता हूं, तो फॉर्म पोस्ट करते समय कुछ भी नहीं होगा। यह सिर्फ साइट को ताज़ा करता है। तो मुझे कोई संकेत नहीं है कि यह क्यों हो रहा है?

यह व्यवहार फिर से लिखने के नियमों के माध्यम से htaccess के कारण होगा। मैंने htaccess हटा दिया और फिर कोशिश की। इसके बिना यह काम करता है लेकिन अभी भी इस बदसूरत यूआरएल है।

क्या htaccess में दिखाने के लिए ठीक है:

form action = "<?php echo $_SERVER['PHP_SELF']?>" method= "post"... 

तो अगर वहाँ कोई है जो मुझे बाहर मदद कर सकता है मैं वास्तव में सराहना करेंगे है:

RewriteEngine On 

RewriteCond %{REQUEST_URI} ^(.*)\.html$ 
RewriteRule ^.*\.html$ %1.php [L] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^([^/]+)/$ $1.php 

AddType application/x-httpd-php .htm .html 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php 

RewriteRule ^index\.(htm|html|php) http://www.domain.com/ [R=301,L] 
## rewrite the index file in subdirectories 
RewriteRule ^(.*)/index\.(htm|html|php) http://www.domain.com/$1/ [R=301,L] 

और फार्म के साथ भेजा जाएगा।

अद्यतन:

अधिक जानकारी के देने के लिए मैं क्या हासिल करना चाहते: क्योंकि अलग-अलग भाषाओं की जड़-संरचना की तरह है::

www.domain.com/languagefolder/... 

सभी संरचना के पहले निम्नलिखित है

अब जब कोई उपयोगकर्ता www.domain.com पर कॉल कर रहा है तो उसे languagesubfolder पर रीडायरेक्ट कर दिया जाएगा। जबकि इस उपफोल्डर के इंडेक्स पेज पर रीडायरेक्ट किया गया है, पहली बात यह होनी चाहिए कि www.domain.com/languagesfolder/index.php दिखाई न दे ताकि यह केवल www.domain.com/languagesfolder/ हो। यह स्वचालित रूप से किया जाएगा। कोई बात नहीं। लेकिन www.domain.com/languagesfolder/index.php पर कॉल करते समय इसे www.domain.com/languagesfolder/ के रूप में पुनः लिखा जाना चाहिए ताकि उपयोगकर्ता .../index.php नहीं देख सके। यह अधिक पेशेवर लगता है।

अगली बात यह होगी कि आगे के पेज लिंक दिए जाएंगे ताकि उपयोगकर्ता को .../page.php के बजाय .../page दर्ज करना होगा ताकि फ़ाइल एक्सटेंशन दिखाई नहीं दे सके। और आखिरी लेकिन कम से कम आखिरी बात यह नहीं होगी कि जब कोई उपयोगकर्ता यह पता लगाने की कोशिश करता है कि यह किस प्रकार की फाइल है, तो मैं एक्सटेंशन को फिर से लिखकर एसक्यूएल इंजेक्शन को रोकना चाहता हूं ताकि उपयोगकर्ता .../page.php के साथ-साथ .../page.html या .../page.htm टाइप कर सके।

+1

सबमिट करने से पहले फॉर्म में वास्तविक कार्रवाई क्या है? उदाहरण के लिए स्रोत दिखाएं और देखें कि यह क्या कहता है? –

+0

कृपया कुछ प्रश्न और प्रतिस्थापन यूआरएल उदाहरणों के साथ अपना प्रश्न अपडेट करें। अन्यथा ** अनुमान लगाना मुश्किल है ** अनुमान लगाएं कि आप कौन से नियम प्राप्त कर रहे हैं और समझ सकते हैं कि आप क्या हासिल करना चाहते हैं। नियमों में 'regex' है जो आने वाले यूआरएल में' पैटर्न 'से मेल खाना चाहिए, लेकिन उस पैटर्न को यूआरएल के बिना निर्धारित नहीं किया जा सकता है। आपके नियम वास्तव में मदद नहीं करते क्योंकि वे काम नहीं करते हैं। –

+0

हैलो, मैंने अपना प्रश्न अपडेट किया। धन्यवाद। – bonny

उत्तर

4

का उपयोग करना:

form action = "<?php echo $_SERVER['PHP_SELF']?>" method= "post"... 

आपके प्रपत्र पोस्ट करने के लिए होने की संभावना की तर्ज पर कुछ में परिणाम होगा: अपने कोड में

form action = "/index.php" method = "post"... 

। कारण है कि आप लाइन के साथ कोई समस्या आ रही:

RewriteRule ^index\.(htm|html|php) http://www.domain.com/ [R=301,L] 

है कि यह, index.php है कि आप करने के लिए पोस्ट कर रहे हैं पकड़ने है तो http://www.domain.com/करने के लिए आप पुनः निर्देशित अपनी पोस्ट डेटा के बिना है।

यदि आप फ़ायरफ़ॉक्स का उपयोग करते हैं और फ़ायरबग स्थापित करते हैं तो आप नेट पैनल को देखकर और अपना फॉर्म सबमिट करने से पहले जारी रखने पर रीयल-टाइम में यह हो सकते हैं। आपको POST /index.php के लिए http://www.domain.com/ के लिए GET द्वारा अनुसरण करने के लिए 301 रीडायरेक्ट दिखाई देगा।

साथ
form action = "<?php echo $_SERVER['PHP_SELF']?>" method= "post"... 

:

form action = "/" method= "post"... 

या:

आप लाइन की जगह इसे ठीक कर सकते

form action = "<?php echo rtrim($_SERVER['PHP_SELF'], 'index.php'); ?>" method= "post"... 

कौन सा str_replace का उपयोग कर के रूप में ही है, लेकिन केवल निकाल देंगे "index.php" की सही-सबसे घटना होती है।

एचटीएच।

+0

हैलो, और इस संकेत के लिए बहुत बहुत धन्यवाद। यह बात है! – bonny

0

.htaccess को देखने और अपने विवरण के माध्यम से पढ़ने से यह थोड़ा अस्पष्ट लगता है कि आप क्या करने की कोशिश कर रहे हैं। ऐसा लगता है कि आप स्वच्छ यूआरएल चाहते हैं (यानी फ़ाइल एक्सटेंशन कभी नहीं दिखाएं), लेकिन फिर भी आप index.php पर पोस्ट करने के बारे में बात करते हैं। यदि आप स्वच्छ यूआरएल का उपयोग करना चाहते हैं तो आपको पूरे यूआरएल का उपयोग करने की ज़रूरत है (यानी / पर पोस्ट करें और /index.php नहीं)।

आपको 0hसे .htaccess से घोषणा को हटा देना चाहिए क्योंकि आपको कभी भी .htm या .html एक्सटेंशन वाली फ़ाइल का अनुरोध नहीं करना चाहिए क्योंकि सभी अनुरोध क्लीन यूआरएल के माध्यम से होंगे।आप शायद एक विरासत उपयोग के मामले के रूप में (आपकी साइट पर बाहरी लिंक के लिए की तुलना में पर *.index अनुरोध अन्य किसी भी पुनर्निर्देशन प्रदर्शन करने की जरूरत नहीं होगी

आप कुछ इस तरह अपनी .htaccess सरल करने के लिए सक्षम होना चाहिए:।

RewriteEngineOn 
# redirect legacy index links. Do this first to clean up URL. No need to use full URL here unless directly to different domain 
RewriteRule ^(.*)index\.(html|htm|php)$ /$1 [R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ /$1.php [L] 
+0

हैलो और मेरी मदद करने के लिए धन्यवाद। यह कोड त्रुटि 500 ​​का कारण बनता है। इस तरह से प्रयास करते समय साइट अनुपलब्ध है। ठीक है और स्पष्टीकरण के लिए: हाँ, मुझे साफ यूआरएल चाहिए। सभी समापन हटा दिया जाना चाहिए। यहां तक ​​कि अगर कोई पेज.php या page.html दर्ज करने का प्रयास करता है तो उसे अपनी मूल फ़ाइल पर रीडायरेक्ट किया जाएगा जो एक PHP या HTML फ़ाइल हो सकता है। अगला मामला यह होगा कि मैं भाषाओं के लिए सबफ़ोल्डर का उपयोग करता हूं और प्रत्येक व्यक्ति का अपना index.php होता है - उस स्थिति में उपयोगकर्ता को यूआरएल के अंत में index.php नहीं दिखना चाहिए, बस domain.com/us/ जैसे पथ domain.com/us/index.php या यहां तक ​​कि .../us/index – bonny

+0

हम्म के बजाय आप 500 को वापस करने के लिए क्या यूआरएल अनुरोध करते थे? आपकी निर्देशिकाओं और index.php फ़ाइलों के संबंध में पहले पुनर्लेखन नियमों में उन सभी का ख्याल रखना चाहिए। मैं बस एक नियम के लिए सरलीकृत। यदि आप समस्याग्रस्त रेखा को निर्धारित करने के लिए वहां कुछ लाइनों पर भी टिप्पणी कर सकते हैं, इससे मदद मिलेगी, क्योंकि यह मेरे लिए आसानी से स्पष्ट नहीं है। –

+0

हैलो, मैं इस त्रुटि को पाने के लिए बस www.domain.com/subfolder/index.php कहलाता हूं। मुझे खेद है कि मैं आगे की लाइनों को निर्धारित नहीं कर सकता क्योंकि एचटीएसीएसी में और कुछ नहीं है। धन्यवाद – bonny

0

आपकी समस्या आपके .htaccess से आते प्रतीत नहीं होता है यहाँ मैं क्या करने की कोशिश की है

.htaccess:।।

RewriteEngine On 
RewriteBase /stackoverflow/15032042 

RewriteCond %{REQUEST_URI} ^(.*)\.html$ 
RewriteRule ^.*\.html$ %1.php [L] 

# I don't understand this RewriteRule 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^([^/]+)/$ $1.php 

AddType application/x-httpd-php .htm .html 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php 

RewriteRule ^index\.(htm|html|php)$ http://www.workspace.domain.tld/stackoverflow/15032042/ [R=301,L] 
RewriteRule ^(.*)/index\.(htm|html|php) http://www.workspace.domain.tld/stackoverflow/15032042/$1/ [R=301,L] 

index.php:

if(isset($_POST)) 
    var_dump($_POST); 
echo '<form action="" method="POST"><input type="hidden" name="test" value="1" /><input type="submit" /></form>'; 

फिर जब मैं http://www.workspace.domain.tld/stackoverflow/15032042/ मारा और फ़ॉर्म सबमिट करेंगे, $_POST सही ढंग से दिखाया गया है।

या शायद आपने RewriteBase के साथ अपने सबफ़ोल्डर के बारे में नहीं सोचा था?

+0

हैलो और आपके उत्तर के लिए धन्यवाद। मुझे पता चला कि यह लाइनें: रिवाइट्रूल^इंडेक्स \। (एचटीएम | एचटीएमएल | पीएचपी) http://www.domain.com/ [आर = 301, एल] रिवाइट्रूल^(। *)/इंडेक्स \। (एचटीएम | एचटीएमएल | php) http://www.domain.com/$1/ [आर = 301, एल] मुझे मिली त्रुटि का कारण बन जाएगा। ऐसा लगता है कि जब मैं/सबफ़ोल्डर/इंडेक्स को कॉल करता हूं तो यह डेटा को पोस्ट नहीं करता है क्योंकि यह फिर से लिखने की स्थिति के कारण खाली है। – bonny

0

क्वेरी स्ट्रिंग को आगे बढ़ाने के लिए आपको नियम में QSARewriteRule flag जोड़ने या क्वेरी स्ट्रिंग को त्याग दिया जाएगा। यह भी अच्छा अभ्यास है, ज्यादातर मामलों में और L ध्वज का उपयोग करने के लिए, अपनी संवेदना को बनाए रखने में मदद करता है जो नियम संतुष्ट होने के बाद आगे के नियमों को संसाधित करने से रोक देगा। आप वास्तव में एक ही समय में कई नियमों के साथ गड़बड़ नहीं करना चाहते हैं, बल्कि अलग-अलग 301 नियम बनाएं और वापस आने पर रीडायरेक्ट से निपटें।

RewriteRule ^(.*)$ $1.php [L,QSA] 

क्या इससे आपकी समस्या हल हो गई?

nJoy!

+0

हैलो और उत्तर देने के लिए धन्यवाद। मुझे पता चला कि यह लाइनें: रिवाइट्रूल^इंडेक्स \। (एचटीएम | एचटीएमएल | php) domain.com [आर = 301, एल] रिवाइट्रूल^(। *)/इंडेक्स \। (एचटीएम | एचटीएमएल | php) domain.com/ $ 1 [आर = 301, एल] मुझे मिली त्रुटि का कारण बन जाएगा। ऐसा लगता है कि जब मैं/सबफ़ोल्डर/इंडेक्स को कॉल करता हूं तो यह डेटा को पोस्ट नहीं करता है क्योंकि यह फिर से लिखने की स्थिति के कारण खाली है। – bonny