2013-06-14 12 views
8

मैं अपने .htaccess फ़ाइल में निम्नलिखित है:RewriteRule बनाने 500 आंतरिक सर्वर त्रुटि

Options +FollowSymLinks 
RewriteEngine on 
RewriteRule ^directory/(.*)$ directory/index.php?id=$1 

यह क्या मैं प्राप्त करने के लिए कोशिश कर रहा हूँ है:

जब यूआरएल www.mydomain.com/directory/10 का दौरा किया है, पेज www.mydomain.com/directory/?id=10 यूआरएल की उपस्थिति को बदलने के बिना ब्राउजर पर प्रदर्शित होता है।

उपरोक्त कोड हालांकि 500 ​​आंतरिक सर्वर त्रुटि बनाता है।

क्या कोई जानता है कि मैं कहां गलत हो रहा हूं?

+2

आम तौर पर एक 500 त्रुटि का मतलब है कि किसी त्रुटि को कहीं भी लॉग किया गया है। अपना अपाचे और PHP त्रुटि लॉग खोजें, और देखें कि वास्तविक त्रुटि क्या है। – IMSoP

+5

ब्राउज़र में दी गई 500 त्रुटि आपको सूचित करनी चाहिए कि पूर्ण त्रुटि संदेश सर्वर लॉग में होगा। उन को पढओ। – Quentin

उत्तर

16

आपका कोड 500 आंतरिक सर्वर त्रुटि उत्पन्न करने की गारंटी देता है क्योंकि यह अनंत लूपिंग का कारण बन रहा है। कारण यह है कि आपका मिलान यूआरआई पैटर्न है: ^directory/(.*)$

जो आपके URL से पहले और बाद में मेल खाता है। और एक बार यह अधिकतम अनुमत आंतरिक पुनर्लेख सीमा तक पहुंचने के बाद अपाचे 500 आंतरिक सर्वर त्रुटि और पूंछ निकाल देता है।

इस के लिए अपने कोड में परिवर्तित करें:

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^directory/(.*)$ /directory/index.php?id=$1 [L,QSA,NC] 

कोड से ऊपर एक अतिरिक्त RewriteCond %{REQUEST_FILENAME} !-f पहली बार के बाद फिर से लिखना के बाद के निष्पादन की अनुमति रद्द करने के बाद से /directory/index.php एक मान्य फ़ाइल हो जाएगा सुनिश्चित करेंगे कि है।

+1

वह शानदार है! धन्यवाद। – Tom

+0

आपका स्वागत है, खुशी है कि यह काम किया। – anubhava

+1

बस यह जोड़ना चाहता था कि मुझे एहसास नहीं हुआ कि मेरा पुनर्लेखन नियम भी खुद का संदर्भ दे रहा था। पुनर्लेखन स्थिति को जोड़ना समस्या को हल करता है। कुछ स्पष्ट लेकिन अनदेखा करना आसान है। –

1

आप सामने से फॉरवर्ड स्लैश जोड़ने का प्रयास करना चाहिए:

RewriteRule ^/directory/(.*)$ directory/index.php?id=$1 

मैंने पहले उस के साथ बाहर पकड़ा गया है।

वैकल्पिक रूप से डिबग करने के लिए RewriteLog और RewriteLogLevel उपयोग करें, और अधिक जानकारी के लिए अपाचे त्रुटि और उपयोग लॉग पर नज़र डालें:

RewriteLogLevel 3 
RewriteLog ${APACHE_LOG_DIR}/rewrite.log 

कि आपके Apache लॉग निर्देशिका में एक लॉग फ़ाइल को छोड़ देगा। मेरे मामले में /var/log/apache

+0

ठीक है कि सर्वर त्रुटि को हल किया गया है, लेकिन अब मुझे 'इस सर्वर पर अनुरोध किया गया URL/निर्देशिका/10 नहीं मिला।' कोई विचार? – Tom

+0

ठीक है, अब ऐसा लगता है कि रिवाइट मेल नहीं खा रहा है। –

+0

लॉग फ़ाइल को इंगित करने के लिए अपने vhost (एक .htaccess में मान्य नहीं हैं) में एक रिवाइटलॉग जोड़ें, जिसे आप लिखना चाहते हैं। मैंने एक उदाहरण के साथ अपना जवाब संपादित कर लिया है। –

9

मुझे एक ही समस्या मिली है और पाया है कि "पुनः लिखना" मॉड्यूल अभी तक मेरे मामले में सक्षम नहीं है। मॉड्यूल

  • सक्षम करें "को फिर से लिखने": sudo a2enmod पुनर्लेखन
  • फिर अपाचे सर्वर को पुनः आरंभ: sudo सेवा apache2 पुनः आरंभ

आशा तो मैं इसे सक्षम करने के लिए और फिर अपाचे सर्वर को पुनः आरंभ की जरूरत है यह किसी की मदद करेगा।

+0

बहुत बढ़िया ... यह मेरे लिए मुद्दा था .... –

0

यदि आप CodeIgniter का उपयोग कर रहे हैं और त्रुटि समस्याओं में 500 है। समाधान का पालन करें।

तो कोडइग्निटर में यूआरएल के "index.php" सेगमेंट को हटाने के लिए, आपको 2 चीजें करने की आवश्यकता है।पहले /system/application/config/config.php फ़ाइल को संपादित करने, खाली करने के लिए index_page नीति का मान बदल रहा है:

$config['index_page'] = ''; 

दूसरे चरण के लिए एक फ़ाइल .htaccess

RewriteEngine on 
RewriteCond $1 !^(index\.php|images|robots\.txt) 
RewriteRule ^(.*)$ index.php/$1 [L] 

बनाने के लिए है और वह यह है! अब से, कोडइग्निटर के साथ बनाई गई आपकी साइट/सिस्टम के यूआरएल में अब थ्रेड नहीं होगा (जिसे कुछ "परेशान" कहा जाता है) "index.php"।

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