apache - डीबगिंग के लिए युक्तियाँ। Htaccess नियमों को फिर से लिखें




.htaccess mod-rewrite (13)

मैंने बर्बाद होने के कुछ घंटों में से एक:

यदि आपने इन सभी युक्तियों को लागू किया है और केवल 500 त्रुटियों पर जा रहे हैं क्योंकि आपके पास सर्वर त्रुटि लॉग तक पहुंच नहीं है, तो समस्या .htaccess में नहीं है, लेकिन फ़ाइलों में यह रीडायरेक्ट करता है।

मैंने अपनी .htaccess-problem को ठीक करने के बाद मैंने इसे और अधिक ठीक करने की कोशिश करने में दो और घंटे बिताए, भले ही मैं बस कुछ अनुमतियों के बारे में भूल गया था।

कई पोस्टर में उनके .htaccess फ़ाइलों के भीतर उनके रिवाइटरूले और रीवाइटकॉन्ड स्टेटमेंट्स को डिबग करने में समस्याएं होती हैं। इनमें से अधिकतर एक साझा होस्टिंग सेवा का उपयोग कर रहे हैं और इसलिए रूट सर्वर कॉन्फ़िगरेशन तक पहुंच नहीं है। वे पुनर्लेखन के लिए .htaccess फ़ाइलों का उपयोग करने से नहीं बच सकते हैं और एक रिवाइट लॉजवेल को सक्षम नहीं कर सकते हैं "जैसा कि कई उत्तरदाताओं का सुझाव है। इसके अलावा कई हैं .htaccess विशिष्ट नुकसान और बाधाओं को अच्छी तरह से कवर नहीं किया गया है। स्थानीय परीक्षण की स्थापना LAMP स्टैक में बहुत अधिक शामिल है अधिकांश के लिए सीखने वक्र।

तो मेरा क्यू यह है कि हम कैसे अनुशंसा करेंगे कि वे अपने नियमों को स्वयं डीबग करें । मैं नीचे कुछ सुझाव प्रदान करता हूं। अन्य सुझावों की सराहना की जाएगी।

  1. समझें कि .htaccess फ़ाइलों के माध्यम से mod_rewrite इंजन चक्र । इंजन इस लूप को चलाता है:

    do
      execute server and vhost rewrites (in the Apache Virtual Host Config)
      find the lowest "Per Dir" .htaccess file on the file path with rewrites enabled
      if found(.htaccess)
         execute .htaccess rewrites (in the user's directory)
    while rewrite occurred
    

    तो आपके नियम बार-बार निष्पादित हो जाएंगे और यदि आप यूआरआई पथ बदलते हैं तो यह अन्य .htaccess फ़ाइलों को निष्पादित करने पर समाप्त हो सकता है यदि वे मौजूद हैं। इसलिए सुनिश्चित करें कि नियमों को फायरिंग रोकने के लिए अतिरिक्त RewriteCond जोड़कर यदि आप आवश्यक हों तो इस लूप को समाप्त कर दें। किसी भी निचले स्तर को हटाएं .htaccess नियमों को दोबारा लिखें जब तक कि बहु-स्तर के नियमों का स्पष्ट रूप से उपयोग करने का इरादा न हो।

  2. सुनिश्चित करें कि प्रत्येक Regexp का सिंटैक्स परीक्षण पैटर्न के एक सेट के खिलाफ परीक्षण करके सही है, यह सुनिश्चित करने के लिए कि यह एक वैध वाक्यविन्यास है और जो आप परीक्षण यूआरआई की पूरी श्रृंखला के साथ काम करते हैं। अधिक जानकारी के लिए नीचे उत्तर देखें।

  3. एक परीक्षण निर्देशिका में अपने नियमों को incrementally बनाएँ। आप अपने मुख्य नियमों को खराब किए बिना और अपनी साइट को काम करने के बिना यहां एक अलग परीक्षण निर्देशिका (पेड़) और डीबग नियम सेट अप करने के लिए "पथ सुविधा पर सबसे गहरी .htaccess फ़ाइल निष्पादित करें" का उपयोग कर सकते हैं। आपको उन्हें एक समय में जोड़ना होगा क्योंकि व्यक्तिगत नियमों में विफलताओं को स्थानीयकृत करने का यही एकमात्र तरीका है।

  4. सर्वर और पर्यावरण चर को डंप करने के लिए एक डमी स्क्रिप्ट स्टब का उपयोग करें । ( लिस्टिंग 2 देखें) यदि आपका ऐप blog/index.php का उपयोग करता है, तो आप इसे test/blog/index.php में कॉपी कर सकते हैं और test उपनिर्देशिका में अपने ब्लॉग नियमों का परीक्षण करने के लिए इसका उपयोग कर सकते हैं। आप यह सुनिश्चित करने के लिए पर्यावरण चर का भी उपयोग कर सकते हैं कि पुनर्वितरण इंजन प्रतिस्थापन तारों को सही तरीके से व्याख्या करने में, उदाहरण के लिए

    RewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]
    

    और phpinfo डंप में इन REDIRECT_ * चर के लिए देखो। बीटीडब्लू, मैंने इसका इस्तेमाल किया और मेरी साइट पर खोज की कि मुझे इसके बजाय %{ENV:DOCUMENT_ROOT_REAL} का उपयोग करना पड़ा। पुनर्निर्देशक लूपिंग के मामले में REDIRECT_REDIRECT_ * चर पिछले पास सूचीबद्ध करते हैं। आदि..

  5. सुनिश्चित करें कि आप अपने ब्राउज़र कैशिंग गलत 301 रीडायरेक्ट कैशिंग द्वारा काट नहीं पाएंगेनीचे जवाब देखें । इसके लिए Ulrich Palha के लिए मेरा धन्यवाद।

  6. पुनर्लेखन इंजन एक .htaccess संदर्भ के भीतर कैस्केड नियमों के प्रति संवेदनशील लगता है, (जहां एक RewriteRule परिणाम प्रतिस्थापन में होता है और यह आगे नियमों के बावजूद गिरता है), क्योंकि मुझे आंतरिक उप-अनुरोध (1) साथ कीड़े मिलती हैं, और गलत PATH_INFO प्रसंस्करण जो अक्सर [एनएस], [एल] और [पीटी] झंडे के उपयोग से रोक सकता है।

कोई और टिप्पणी या सुझाव?

लिस्टिंग 1 - phpinfo

<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);

भूलें कि .htaccess फ़ाइलों में यह एक सापेक्ष यूआरएल है जो मेल खाता है।

.htaccess फ़ाइल में निम्न RewriteRule कभी मेल नहीं खाएगा:

RewriteRule ^/(.*)     /something/$s

मुझे अपने mod_rewrite मुद्दों को डीबग करने का प्रयास करते समय यह प्रश्न मिला, और इसमें निश्चित रूप से कुछ सहायक सलाह है। लेकिन अंत में सबसे महत्वपूर्ण बात यह सुनिश्चित करना है कि आपके रेगेक्स सिंटैक्स सही हैं। अपने स्वयं के आरई वाक्यविन्यास के साथ समस्याओं के कारण, regexpCheck.php स्क्रिप्ट स्थापित करना व्यवहार्य विकल्प नहीं था।

लेकिन चूंकि अपाचे पर्ल-संगत नियमित अभिव्यक्तियों (पीसीआरई) का उपयोग करता है, इसलिए कोई भी उपकरण जो पीसीआरई लिखने में मदद करता है, मदद करनी चाहिए। मैंने अतीत में जावा और जावास्क्रिप्ट आरई के साथ रेगेक्सप्लानेट के टूल का उपयोग किया है, और यह जानकर खुशी हुई कि वे पर्ल का भी समर्थन करते हैं।

बस अपनी नियमित अभिव्यक्ति और एक या अधिक उदाहरण यूआरएल टाइप करें, और यह आपको बताएगा कि रेगेक्स मैचों ("~ =" कॉलम में "1") और यदि लागू हो, तो कोई मिलान करने वाला समूह ("विभाजन" में संख्याएं कॉलम प्रत्येक यूआरएल के लिए अपाचे अपेक्षाओं, उदाहरण के लिए $ 1, $ 2 इत्यादि) के अनुरूप होगा। वे दावा करते हैं कि पीसीआरई समर्थन "बीटा में" है, लेकिन यह मेरी सिंटैक्स समस्याओं को हल करने के लिए आवश्यक था।

http://www.regexplanet.com/advanced/perl/index.html

मैंने बस एक मौजूदा उत्तर में एक टिप्पणी जोड़ दी होगी लेकिन मेरी प्रतिष्ठा अभी तक उस स्तर पर नहीं है। उम्मीद है कि यह किसी की मदद करता है।


मैं इसे यहां छोड़ दूंगा, शायद स्पष्ट विवरण, लेकिन मुझे घंटों तक अपने सिर पर टक्कर लगी है : %{REQUEST_URI} का उपयोग करके सावधान रहें क्योंकि @Krist van Besien अपने उत्तर में क्या कहता है पूरी तरह से सही है, लेकिन REQUEST_URI स्ट्रिंग के लिए नहीं , क्योंकि इस टेस्टस्ट्रिंग के बाहर एक / साथ शुरू होता है। तो अपना ख्याल रखना:

RewriteCond %{REQUEST_URI} ^/assets/$  
                            ^
                            | check this pesky fella right here if missing

4 के बारे में, आपको अभी भी यह सुनिश्चित करने की ज़रूरत है कि आपके "डमी स्क्रिप्ट स्टब" वास्तव में सभी पुनर्लेखन के बाद लक्षित यूआरएल है, या आप कुछ भी नहीं देखेंगे!

एक समान / संबंधित चाल ( यह प्रश्न देखें) एक अस्थायी नियम डालना है जैसे कि:

RewriteRule (.*) /show.php?url=$1 [END]

जहां show.php कुछ बहुत ही सरल स्क्रिप्ट है जो केवल $_GET पैरामीटर प्रदर्शित करती है (यदि आप चाहें तो पर्यावरण चर भी प्रदर्शित कर सकते हैं)।

यह उस बिंदु पर पुनर्लेखन को रोक देगा जो आप इसे रीसेट में डालेंगे, बल्कि डीबगर में ब्रेकपॉइंट की तरह।

यदि आप अपाचे <2.3.9 का उपयोग कर रहे हैं, तो आपको [END] बजाय [L] का उपयोग करने की आवश्यकता होगी, और फिर आपको यह जोड़ने की आवश्यकता हो सकती है :

RewriteRule ^show.php$ - [L]

अपने /show.php शीर्ष पर, यदि URL /show.php स्वयं को फिर से लिखा जा रहा है।


यदि आप .htacesss में नियमों की केवल एक पंक्ति से अधिक लिखने की योजना बना रहे हैं,
इसे डीबग करने के लिए उन हॉट-फ़िक्स विधियों में से किसी एक को आजमाने के बारे में भी सोचें।

मैंने LOGs से फीडबैक के बिना कई नियमों को सेट करने के दिन बर्बाद कर दिए हैं, केवल अंततः एक को छोड़ने के लिए।
मुझे अपने पीसी पर अपाचे मिला, पूरी साइट को एचडीडी में कॉपी किया गया, और पूरे नियम-सेट को लॉग का उपयोग करके हल किया गया।
तब मैंने अपने पुराने नियमों की समीक्षा की जो काम कर रहे थे, मैंने देखा कि वे वास्तव में वांछित नहीं कर रहे थे। थोड़ा अलग पता के लिए एक समय बम।

फिर से लिखने के नियमों में इतने सारे गड्ढे गिरते हैं, यह बिल्कुल सही तर्क नहीं है।
आप अपाचे को दस मिनट में चला सकते हैं और 10 मिनट में चल सकते हैं, यह 10 एमबी, अच्छा लाइसेंस, * एनआईक्स / विन / मैक तैयार है, यहां तक ​​कि इंस्टॉल किए बिना भी।
साथ ही, अपने सर्वर की हेडर लाइनों की जांच करें और अगर यह पुराना हो तो अपाचे का उसी संस्करण संग्रह से प्राप्त करें। मेरा ओपी अभी भी 2.0 पर है, कई चीजें समर्थित नहीं हैं।


सुनिश्चित करें कि प्रत्येक Regexp का वाक्यविन्यास सही है

परीक्षण पैटर्न के एक सेट के खिलाफ परीक्षण करके यह सुनिश्चित करने के लिए कि यह एक वैध वाक्यविन्यास है और जो आप परीक्षण यूआरआई की पूरी श्रृंखला के साथ काम करते हैं, वह करता है।

एक सरल स्क्रिप्ट के लिए नीचे regexpCheck.php देखें जिसे आप अपनी साइट में एक निजी / परीक्षण निर्देशिका में जोड़ सकते हैं ताकि आप ऐसा कर सकें। मैंने सुंदर के बजाए यह संक्षिप्त रखा है। बस इसे अपनी वेबसाइट पर उपयोग करने के लिए एक परीक्षण निर्देशिका में regexpCheck.php फ़ाइल में regexpCheck.php । यह आपको किसी भी regexp का निर्माण करने और टेस्ट मामलों की सूची के खिलाफ परीक्षण करने में आपकी सहायता करेगा जैसा आप करते हैं। मैं यहां PHP पीसीआरई इंजन का उपयोग कर रहा हूं, लेकिन अपाचे स्रोत पर एक नज़र डालने के बाद, यह मूल रूप से अपाचे में उपयोग किए जाने वाले व्यक्ति के समान है। कई HowTos और ट्यूटोरियल हैं जो टेम्पलेट प्रदान करते हैं और आपको अपने regexp कौशल बनाने में मदद कर सकते हैं।

लिस्टिंग 1 - regexpCheck.php

<html><head><title>Regexp checker</title></head><body>
<?php 
    $a_pattern= isset($_POST['pattern']) ? $_POST['pattern'] : "";
    $a_ntests = isset($_POST['ntests']) ? $_POST['ntests'] : 1;
    $a_test   = isset($_POST['test']) ? $_POST['test'] : array();

    $res = array(); $maxM=-1; 
    foreach($a_test as $t ){
        $rtn = @preg_match('#'.$a_pattern.'#',$t,$m);
        if($rtn == 1){
            $maxM=max($maxM,count($m));
            $res[]=array_merge( array('matched'),  $m );
        } else {
            $res[]=array(($rtn === FALSE ? 'invalid' : 'non-matched'));
        }
    } 
?> <p>&nbsp; </p>
<form method="post" action="<?php echo $_SERVER['SCRIPT_NAME'];?>">
    <label for="pl">Regexp Pattern: </label>
    <input id="p" name="pattern" size="50" value="<?php echo htmlentities($a_pattern,ENT_QUOTES,"UTF-8");;?>" />
    <label for="n">&nbsp; &nbsp; Number of test vectors: </label>
    <input id="n" name="ntests"  size="3" value="<?php echo $a_ntests;?>"/>
    <input type="submit" name="go" value="OK"/><hr/><p>&nbsp;</p>
    <table><thead><tr><td><b>Test Vector</b></td><td>&nbsp; &nbsp; <b>Result</b></td>
<?php 
    for ( $i=0; $i<$maxM; $i++ ) echo "<td>&nbsp; &nbsp; <b>\$$i</b></td>";
    echo "</tr><tbody>\n";
    for( $i=0; $i<$a_ntests; $i++ ){
        echo '<tr><td>&nbsp;<input name="test[]" value="', 
            htmlentities($a_test[$i], ENT_QUOTES,"UTF-8"),'" /></td>';
        foreach ($res[$i] as $v) { echo '<td>&nbsp; &nbsp; ',htmlentities($v, ENT_QUOTES,"UTF-8"),'&nbsp; &nbsp; </td>';}
        echo "</tr>\n";
    }
?> </table></form></body></html>

(डोन विचार के समान) यह दिखाने के लिए कि क्या मिलान किया जा रहा है, मैं इस कोड का उपयोग करता हूं

$keys = array_keys($_GET);
foreach($keys as $i=>$key){
    echo "$i => $key <br>";
}

सर्वर रूट पर r.php पर सहेजें और फिर .htaccess में कुछ परीक्षण करें
उदाहरण के लिए, मैं उन यूआरएल से मेल खाना चाहता हूं जो भाषा उपसर्ग से शुरू नहीं होते हैं

RewriteRule ^(?!(en|de)/)(.*)$ /r.php?$1&$2 [L] #$1&$2&...
RewriteRule ^(.*)$ /r.php?nomatch [L] #report nomatch and exit

ऑनलाइन। Htaccess परीक्षण फिर से लिखना

मुझे RegEx मदद के लिए यह गुगलिंग मिली, इसने मुझे हर बार एक छोटा संशोधन करने पर नई .htaccess फ़ाइलों को अपलोड करने से बहुत समय बचाया।

साइट से:

htaccess परीक्षक

अपने एचटीएसीएएस रीराइट नियमों का परीक्षण करने के लिए, बस उस यूआरएल को भरें जिसे आप नियम लागू कर रहे हैं, बड़े इनपुट क्षेत्र पर अपनी एचटीएसीएसी की सामग्री रखें और "अभी जांचें" बटन दबाएं।


कुछ गलतियों को मैंने देखा जब लिखते हैं .htaccess

^(.*)$ का उपयोग करके कई नियमों में ^(.*)$ दोबारा उपयोग करना, अधिकांश मामलों में अन्य नियमों को नपुंसक होने का कारण बनता है, क्योंकि यह एकल हिट में सभी यूआरएल से मेल खाता है।

इसलिए, यदि हम इस यूआरएल sapmle/url लिए नियम का उपयोग कर रहे हैं तो यह इस यूआरएल sapmle/url/string भी उपभोग करेगा।

[L] ध्वज का उपयोग यह सुनिश्चित करने के लिए किया जाना चाहिए कि हमारे नियम ने प्रसंस्करण किया है।

इसके बारे में पता होना चाहिए:

% N और $ n में अंतर

%n %{RewriteCond} भाग के दौरान मेल खाता है और $n %{RewriteRule} भाग पर मेल खाता है।

रिवाइटबेस का काम करना

रिवाइटबेस निर्देश निर्देशक यूआरएल उपसर्ग को प्रति-निर्देशिका (एचटीएसीएएस) रीवाइट्रूल निर्देशों के लिए उपयोग किया जाता है जो एक सापेक्ष पथ को प्रतिस्थापित करते हैं।

यह निर्देश आवश्यक है जब आप प्रति-निर्देशिका (htaccess) संदर्भ में प्रतिस्थापन में किसी सापेक्ष पथ का उपयोग करते हैं, जब तक कि निम्न में से कोई भी स्थिति सत्य न हो:

मूल अनुरोध, और प्रतिस्थापन, DocumentRoot के नीचे हैं (जैसा कि अन्य माध्यमों से पहुंचने योग्य है, जैसे उपनाम)। रिवाइटर रूल युक्त निर्देशिका के लिए फाइल सिस्टम पथ, सापेक्ष प्रतिस्थापन द्वारा प्रत्यय सर्वर पर एक यूआरएल पथ के रूप में भी मान्य है (यह दुर्लभ है)। अपाचे HTTP सर्वर 2.4.16 और बाद में, जब यह अनुरोध उपनाम या mod_userdir के माध्यम से मैप किया जाता है, तो यह निर्देश छोड़ा जा सकता है।


पर्यावरण चर सेट करें और उन्हें प्राप्त करने के लिए हेडर का उपयोग करें:

आप ओपी द्वारा उल्लिखित रीवाइटरूल लाइनों के साथ नए पर्यावरण चर बना सकते हैं:

RewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]

लेकिन अगर आप काम करने के लिए सर्वर-साइड स्क्रिप्ट नहीं प्राप्त कर सकते हैं, तो आप इस पर्यावरण चर को कैसे पढ़ सकते हैं? एक समाधान हेडर सेट करना है:

Header set TEST_FOOBAR "%{REDIRECT_TEST0}e"

मान पर्यावरण चर के लिए %{NAME}e विनिर्देशक सहित प्रारूप विनिर्देशकों को स्वीकार करता है (लोअरकेस ई को न भूलें)। कभी-कभी, आपको REDIRECT_ उपसर्ग जोड़ने की आवश्यकता होगी, लेकिन जब उपसर्ग जोड़ा जाता है और जब ऐसा नहीं होता है तो मैंने काम नहीं किया है।


परीक्षण नियमों पर कुछ अतिरिक्त युक्तियां दी गई हैं जो साझा होस्टिंग पर उपयोगकर्ताओं के लिए डिबगिंग को कम कर सकती हैं

1. नकली उपयोगकर्ता एजेंट का प्रयोग करें

किसी नए नियम का परीक्षण करते समय, केवल एक fake उपयोगकर्ता-एजेंट के साथ निष्पादित करने के लिए एक शर्त जोड़ें जिसे आप अपने अनुरोधों के लिए उपयोग करेंगे। इस तरह यह आपकी साइट पर किसी और को प्रभावित नहीं करेगा।

जैसे

#protect with a fake user agent
RewriteCond %{HTTP_USER_AGENT}  ^my-fake-user-agent$
#Here is the actual rule I am testing
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC] 
RewriteRule ^ http://www.domain.com%{REQUEST_URI} [L,R=302] 

यदि आप फ़ायरफ़ॉक्स का उपयोग कर रहे हैं, तो आप नकली उपयोगकर्ता एजेंट स्ट्रिंग और परीक्षण बनाने के लिए उपयोगकर्ता एजेंट स्विचर का उपयोग कर सकते हैं।

2. जब तक आप परीक्षण नहीं कर लेते हैं तब तक 301 का उपयोग न करें

मैंने इतनी सारी पोस्ट देखी हैं जहां लोग अभी भी अपने नियमों का परीक्षण कर रहे हैं और वे 301 का उपयोग कर रहे हैं। मत करो

यदि आप अपनी साइट पर सुझाव 1 का उपयोग नहीं कर रहे हैं, न केवल आप, लेकिन उस समय आपकी साइट पर आने वाले किसी भी व्यक्ति को 301 से प्रभावित किया जाएगा।

याद रखें कि वे आपके ब्राउज़र द्वारा स्थायी, और आक्रामक रूप से कैश किए गए हैं। इसके बावजूद 302 का उपयोग करें, फिर इसे 301 पर बदलें।

3. याद रखें कि 301 के आक्रामक रूप से आपके ब्राउज़र में कैश किए गए हैं

यदि आपका नियम काम नहीं करता है और यह आपके लिए सही लगता है, और आप सुझाव 1 और 2 का उपयोग नहीं कर रहे थे, तो अपने ब्राउज़र कैश को साफ़ करने या निजी ब्राउज़िंग के दौरान पुनः परीक्षण करें।

4. HTTP कैप्चर टूल का उपयोग करें

अपने ब्राउज़र और सर्वर के बीच वास्तविक HTTP ट्रैफ़िक देखने के लिए Fiddler जैसे HTTP कैप्चर टूल का उपयोग करें।

जबकि अन्य लोग कह सकते हैं कि आपकी site does not look right , तो आप इसके बजाय देख सकते हैं और रिपोर्ट कर सकते हैं कि all of the images, css and js are returning 404 errors , जिससे समस्या को जल्दी से कम किया जा सके।

जबकि अन्य रिपोर्ट करेंगे कि आपने started at URL A and ended at URL C , तो आप देख पाएंगे कि वे URL A, were 302 redirected to URL B and 301 redirected to URL C पर शुरू हुए URL A, were 302 redirected to URL B and 301 redirected to URL C । भले ही यूआरएल सी अंतिम लक्ष्य था, आपको पता चलेगा कि यह एसईओ के लिए बुरा है और इसे ठीक करने की जरूरत है।

आप सर्वर पक्ष पर सेट किए गए कैश हेडर देख पाएंगे, अनुरोधों को फिर से चला सकते हैं, अनुरोध हेडर को परीक्षण करने के लिए संशोधित कर सकते हैं ....


मैं एक उत्तर के लिए थोड़ा देर कर रहा हूं, लेकिन जब से मैं एक समान व्यवहार की खोज कर रहा था, मैंने सोचा कि मुझे इसे साझा करना चाहिए: आप क्वेरी स्ट्रिंग को हटाने के लिए एक फिर से लिखना नियम को एक झंडा भी जोड़ सकते हैं; झंडा है [QSD] , और यह कामकाज से बचने में मदद करता है ? अतं मै ;-)

यहां आप इस ध्वज के बारे में अधिक जानकारी प्राप्त कर सकते हैं। मुझे लगता है कि "यह झंडा [अपाचे] संस्करण 2.4.0 और बाद में उपलब्ध है"







apache .htaccess mod-rewrite