डिबगिंग के लिए युक्तियाँ .htaccess नियमों को फिर से लिखना


272

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

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

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

    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 का सिंटैक्स परीक्षण पैटर्न के एक सेट के खिलाफ परीक्षण करके सही है, यह सुनिश्चित करने के लिए कि एक वैध सिंटैक्स है और वह करता है जो आप परीक्षण URI की पूरी श्रृंखला के साथ करना चाहते हैं। देखें नीचे इस सवाल का जवाब अधिक जानकारी के लिए।

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

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

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

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

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

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

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

लिस्टिंग 1 - phpinfo

<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);

10
ये अच्छे हैं ... शायद आपको उन्हें प्रश्न से उत्तर में स्थानांतरित करना चाहिए।
w00t

@ w00t, मैंने आपके सुझाव के अनुसार regexp चेकर को अलग कर दिया है क्योंकि मैं इसे अन्य उत्तरों में लिंक द्वारा संदर्भित करना चाहता हूं।
टेरी

3
आप अपने पहले सुझाव में डॉक्स से नियंत्रण प्रवाह आरेख जोड़ना चाह सकते हैं । IMO यह किसी भी छद्मकोड या स्पष्टीकरण की तुलना में बहुत आसान है, और यह वास्तव में मॉड-रीराइट वूडू का सबसे काला हिस्सा है।
शनि

नंबर 6 बहुत बड़ी बात है। मानक। अपाचे विन्यास फाइलों में बनाम .htaccess फ़ाइलों में अलग-अलग व्यवहार करने वाले नियमों को बहुत से लोगों को पकड़ना होगा।
इयान कॉलिन्स

इन संकेतों को जोड़ने के लायक कुछ हो सकता है: मैंने कुछ समय इसे फिर से निर्देशित करने और पुनर्लेखन नहीं करने के साथ एक समस्या को डीबग करने में बिताया। यह पता चला कि मैंने इसे "/ टिप्पणी" के लिए पुनर्लेखन किया था जब मैं "/ टिप्पणी /" चाहता था। यह "/ टिप्पणी" के लिए फिर से लिख रहा था और फिर सर्वर "/ टिप्पणी /" पर पुनर्निर्देशित कर रहा था। अपाचे के लिए स्पष्ट व्यवहार, लेकिन शायद मेरे जैसे नोक के लिए कम।
क्रिस

जवाबों:


132

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

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 C अंतिम लक्ष्य था, आपको पता होगा कि यह SEO के लिए बुरा है और इसे ठीक करने की आवश्यकता है।

आप कैश हेडर देख पाएंगे जो सर्वर साइड पर सेट किए गए थे, रिक्वेस्ट रिक्वेस्ट करते हैं, रिक्वेस्ट हेडर को टेस्ट करने के लिए संशोधित करते हैं ...।



9
उलरिच, इस इनपुट के लिए बहुत बहुत धन्यवाद। आपने कुछ ऐसे पहलुओं को उठाया है जो मैंने अपनी सूची में डालने के बारे में नहीं सोचा था। 301 डिबगिंग समस्या पर, मैं "निजी ब्राउजिंग" (AKA "पोर्न-मोड") में क्रोम का उपयोग करता हूं क्योंकि यह विंडो बंद करते समय इस राज्य की जानकारी को डंप करता है। मुझे आशा है कि आप मुझे बुरा नहीं मानेंगे क्योंकि यह एक महत्वपूर्ण बिंदु है, लेकिन एक भी सर्वोत्तम उत्तर नहीं है। एक बार फिर धन्यवाद। :)
टेरी

1
यह स्पष्ट करने के लिए (आपके पास यह आपके कोड में है, लेकिन इसे स्पॉट नहीं किया है) लेकिन यह सुनिश्चित करने के लिए कि आप 302 का उपयोग नहीं कर रहे हैं 301 की आवश्यकता नहीं है पुनर्निर्देशित करें[L,R=302]
icc97

6
आपको स्पष्ट रूप से यह निर्दिष्ट करने की आवश्यकता नहीं [L, R=302]है [L,R]कि डिफ़ॉल्ट क्या है302
राहिल वज़ीर

2
@goodeye, "Chrome> Settings> General> Disable Cache जबकि DevTools खुला है" चेकबॉक्स देखें।
जॉन्सनल्स ने

83

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

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

साइट से:

htaccess टेस्टर

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


6
इस टूल को पॉइंटर के लिए धन्यवाद, जिसे मैंने अपनी समस्या को डीबग करने का सबसे सीधा तरीका पाया।
BobHy

यदि आपके पास अपने webspace का ssh एक्सेस है, तो एक और विकल्प है। सर्वर पर एडिटर के माध्यम से .htaccess को सीधे बदलना।
एसजेड

आपको ssl की चेतावनी को अनदेखा करने की आवश्यकता होगी b / c साइट्स प्रमाणपत्र में समस्याएँ हैं। लेकिन साइट अभी भी वहाँ है। यह सबसे अच्छा और आसान उपाय है। यह गलत है और इस मुद्दे को हल करने में परिणाम में अविश्वसनीय अंतर्दृष्टि देता है।
टोडरमो

इस टूल की ओर इशारा करने के लिए धन्यवाद। यह मददगार है, कभी-कभी अपाचे की डिबगिंग htaccess अपने आप में बहुत मुश्किल है। धन्यवाद। बड़ा धन्यवाद
बेनामिन लिमांतो

लगता है कि लिंक संदर्भित छोटी गाड़ी है और हमेशा आपको सटीक आउटपुट नहीं देती है। कृपया पूरी तरह से निश्चित होने के लिए वास्तविक अपाचे पर जाँच करें।
पार्थ

13

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

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

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

4
हाँ, एक रिवायत नियम में खिलाया गया तार सापेक्ष है और इसलिए किसी भी अग्रणी पर छीन लिया गया है /, लेकिन यह स्ट्रिप रिवर्ट कॉन्ड कमांड में इकट्ठे मैच स्ट्रिंग्स के लिए नहीं होती है ।
टेरी सेप 4'15

8

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

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

एक साधारण स्क्रिप्ट के लिए नीचे regexpCheck.php देखें जिसे आप अपनी साइट पर एक निजी / परीक्षण निर्देशिका में जोड़ सकते हैं ताकि आपको यह मदद मिल सके। मैं सुंदर के बजाय इस संक्षिप्त रखा है। regexpCheck.phpअपनी वेबसाइट पर इसका उपयोग करने के लिए बस इसे परीक्षण निर्देशिका में एक फ़ाइल में पेस्ट करें। यह आपको किसी भी regexp को बनाने में मदद करेगा और परीक्षण मामलों की सूची के खिलाफ परीक्षण करेगा जैसा कि आप ऐसा करते हैं। मैं यहां PHP PCRE इंजन का उपयोग कर रहा हूं, लेकिन अपाचे स्रोत पर एक नज़र थी, यह मूल रूप से अपाचे में उपयोग किए गए समान है। कई हॉव्टोस और ट्यूटोरियल हैं जो टेम्पलेट प्रदान करते हैं और आपके 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>

1
त्वरित नोट: import_request_variablesPHP 5.3 में पदावनत किया गया और 5.4 में हटा दिया गया। extract($_GET)युग्मित extract($_POST)समान कार्य कर सकता है, लेकिन सभी चर को उनके नाम से हटाए गए उपसर्ग की आवश्यकता होगी। स्रोत: php.net/manual/en/function.import-request-variables.php
जेफ़ लैंबर्ट

@ वॉचर, धन्यवाद। मैंने अपने स्थानीय संस्करण को एक साल पहले 5.4 संगत होने के लिए अपडेट किया था, लेकिन इस पोस्टिंग को बदलना भूल गया। अब हो गया।
टेरी

ओह माय, एडिट के बाद भी, अपने कोड को कॉपी करके अच्छे परिणाम प्राप्त नहीं कर सकते ... लेकिन regex fiddlers के साथ, मैं अपने उपकरण को किसी भी तरह अप्रचलित कर रहा हूं। इन कूल टूल्स को देखें: regex101.com या refiddle.com या regexr.com
hexerei सॉफ्टवेयर

@hexereisoftware, यह पोस्ट 3 साल पुरानी है, इसलिए पीएचपी संस्करण के आधार पर सूक्ष्म मुद्दे हो सकते हैं जो अब उपयोग करते हैं और अपाचे संस्करण। हालाँकि सूक्ष्म अंतर के साथ प्रत्येक के regexp के कई रूप हैं। जैसा कि मैंने कहा कि अपाचे कोड एक PCRE इंजन का उपयोग करता है जो PHP इंजन के समान है। मुझे यकीन नहीं है कि .Net जैसे वैरिएंट के साथ क्या अंतर है, इसलिए ऑनलाइन संसाधन का उपयोग करने का आपका सुझाव एक अच्छा है, मैं एक के साथ रहना चाहूँगा जो स्पष्ट रूप से अपाचे या PHP सिंटैक्स का समर्थन करता है। :-)
टेरी

पर्ल निकटतम होगा, लेकिन php एक ही वाक्यविन्यास का उपयोग करता है
hexerei सॉफ्टवेयर

7

सुनिश्चित करें कि आप चर चिह्न के सामने प्रतिशत चिह्न का उपयोग करते हैं, न कि डॉलर चिह्न का।

यह %{HTTP_HOST}, नहीं ${HTTP_HOST} । Error_log में कुछ भी नहीं होगा, कोई आंतरिक सर्वर त्रुटियां नहीं होंगी, आपका regexp अभी भी सही है, नियम केवल मेल नहीं खाएगा। यदि आप django / genshi के साथ काम करते हैं और ${}मांसपेशियों की स्मृति में परिवर्तनशील प्रतिस्थापन के लिए काम करते हैं तो यह वास्तव में छुपा हुआ है ।


1
हां, $ प्रतिस्थापन चर अंतिम रीटराइट पैटर्न से संबंधित हैं और % लोग अंतिम रेवेरिटकॉन्ड पैटर्न से संबंधित हैं और विशेष% जैसे% {env: XXX}
टेरी

7

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

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

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


मैं अपनी व्यक्तिगत साइट के लिए एक साझा पहुँच होस्टिंग वेब सेवा का उपयोग करता हूं, लेकिन मैंने जो किया है वह एक परीक्षण वीएम सेट करने के लिए है जो PHP / Apache config, होम डायरेक्टरी, आदि के संदर्भ में मोटे तौर पर दिखाता है। हालांकि, क्योंकि यह VM मेरे तहत है व्यवस्थापक I किसी भी मुश्किल .htaccessमुद्दों के निदान के लिए लॉगिंग को फिर से लिखना सक्षम कर सकता है ।
टेरी सिप

6

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

आप नए पर्यावरण चर बना सकते हैं, जैसा कि ओपी द्वारा उल्लिखित है।

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

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

Header set TEST_FOOBAR "%{REDIRECT_TEST0}e"

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


क्या आपने REDIRECT_उपसर्ग का उपयोग करने या न करने के बारे में अधिक जानकारी प्राप्त की है ? इसके अलावा, मैं अन्य (htaccess) संदर्भों में उपसर्गों के बारे में भी शब्दावली देखता हूं, लेकिन यह कभी स्पष्ट नहीं हुआ कि इसका क्या मतलब है। क्या इसका मतलब है कि आपको अपने चर का नाम उपसर्ग के साथ रखना चाहिए, या अपने नामांकित चर में उपसर्ग जोड़ना होगा, जब कुछ कमांड (लेकिन अन्य कमांड नहीं) का उपयोग कर रहे हों? आपका उदाहरण वह पहला है जो var परिभाषा, और var उपयोग दोनों को दिखाता है , इसलिए इससे मैं उत्तरार्द्ध को सोचने के लिए इच्छुक हूं! डॉक्स की थोड़ी मदद की गई है-मान लें कि हम बहुत अधिक जानते हैं, और बहुत कम संदर्भ / लिंक देते हैं।
शेरलहोमन

5

यदि आप रीडायरेक्ट बना रहे हैं, तो ब्राउज़र कैशिंग समस्याओं से बचने के लिए कर्ल के साथ परीक्षण करें । Http हेडर लाने के लिए -I का उपयोग करें। उपयोग -L सभी पुनर्निर्देशन का पालन करने के लिए।


3

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

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

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

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

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


अच्छा उपकरण, लेकिन भयानक रूप ... इन शांत उपकरणों की जाँच करें: regex101.com या refiddle.com या regexr.com
hexerei सॉफ्टवेयर

3

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

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

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

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

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

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

RewriteRule ^show.php$ - [L]

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


3

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

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

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


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


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

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

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

रीराइटीबेस का कार्य करना

RewriteBase निर्देश प्रति-निर्देशिका (htaccess) RewriteRule निर्देशों के लिए उपयोग किए जाने वाले URL उपसर्ग को निर्दिष्ट करता है जो एक सापेक्ष पथ को प्रतिस्थापित करता है।

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

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


2

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

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

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


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

1
मैं इससे सहमत होता अगर आपके ए को डिबगिंग mod_rewriteनियमों के लिए एक वैकल्पिक सुझाव के रूप में तैयार किया गया था , लेकिन उद्घाटन "इसके बारे में भी नहीं सोचता है" बस बुनियादी साझा सेवा उपयोगकर्ताओं के लिए बुरी सलाह है जो यह समझने के लिए संघर्ष कर रहे हैं कि उनकी htaccessफाइलें क्यों आती हैं ' टी वे जिस तरह से काम करते हैं जो उन्हें चाहिए।
टेरीई

मुझे खेद है कि अगर यह सलाह देने का आपका काम अच्छा लग रहा था कि सलाह का एक अच्छा संग्रह बेकार है। मैं ऐसा नहीं चाहता था। मेरा विश्वास करो, मैं इस धागे की पेशकश की सलाह को पढ़ने और पालन करने में बहुत खुश था। लेकिन मेरे नियम धीरे-धीरे जटिल होते गए और आखिर में, मैंने अपाचे सर्वर को स्थापित करने की परेशानी से गुजरने के लिए बहुत समय बर्बाद किया और डिबगिंग को वैसा ही किया जैसा कि किया जाना चाहिए। इससे अधिक, मैंने कुछ नहीं सीखा, जैसा कि मैंने देखा नहीं था, लॉग में, वास्तव में क्या हो रहा था। और बहुत सारा सामान चल रहा है। मेरा मानना ​​है कि इस अनुभव को साझा करना भी मूल्यवान है।
पापो

दूसरे भाग के लिए, एक IF है। मेरा पाठ कभी भी शुरू नहीं हुआ 'मैं भी अब नहीं देखता' के बारे में, यह शब्द थोड़ा कठोर लगता है लेकिन यह सब सच है। खासकर उन लोगों के लिए जो इस के लिए नए हैं और समझने के लिए संघर्ष कर रहे हैं। यहाँ सलाह उन्हें मेरी तरह गुमराह कर सकती है, मुझे इसकी ज़रूरत है कि एक ठोस regex है, यह इतना आसान नहीं है, जैसे कि आपकी बात 6) PATH_INFO ने मुझे बहुत परेशानी में डाला और यह एक बग नहीं है जैसा कि आप कहते हैं, लेकिन एक विशेषता है। यदि आप नहीं चाहते कि इसे फिर से जोड़ा जाए, तो [DPI] का उपयोग करें। लेकिन अगर आप लॉग को देखेंगे, तो आप देखेंगे कि इसे वहीं जोड़ा जा रहा है। यही कारण है कि, एक से अधिक लाइन, और आप लॉग का उपयोग कर बेहतर हैं
पापो

1
क्षमा करें @papo, लेकिन -1 वोट का मेरा कारण यह था कि मुझे लगता है कि यह "इसके बारे में भी नहीं सोचता" खराब सलाह है, आईएमओ। यदि आपकी बात यह थी कि "एक निश्चित जटिलता से ऊपर है, तो आपको अपनी .htaccessफ़ाइलों को डीबग करने के लिए स्थानीय अपाचे सेवा स्थापित करना आसान हो सकता है " तो यह अधिक संतुलित है। हां, एक स्थानीय अपाचे सेवा स्थापित करना काफी आसान है, लेकिन सेवा प्रदाता की साझा होस्टिंग सेवा को प्रतिबिंबित करने के लिए इसे प्राप्त करना जटिल हो सकता है, और कई उपयोगकर्ताओं के कौशल स्तर से परे, जिन्होंने शायद Wordpress के एक-क्लिक सेटअप का उपयोग किया हो, कहते हैं, और उनकी .htaccessफ़ाइल के साथ समस्याएँ हैं ।
टेरीई

1

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

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

0

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

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

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

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

1
बस एक phpinfo () स्टब का उपयोग करते हुए जैसा कि मैंने अपने ओ / पी पर बिंदु 4 में उल्लेख किया है, मूल रूप से एक ही बात करता है। तलाश करेंQUERY_STRING
टेरी

0

जैसा कि @Jastell द्वारा बताया गया है, ऑनलाइन परीक्षक एक .htaccess फ़ाइल के विरुद्ध व्यक्तिगत रीडायरेक्ट के परीक्षण का एक अच्छा काम करता है। हालांकि, अधिक दिलचस्प एपी का पर्दाफाश है जो कि एक जोंस ऑब्जेक्ट का उपयोग करते हुए यूआरएल की सूची का परीक्षण करने के लिए इस्तेमाल किया जा सकता है। हालाँकि, इसे और अधिक उपयोगी बनाने के लिए, मैंने एक छोटी सी bash स्क्रिप्ट फ़ाइल लिखी है, जो कर्ल और jq का उपयोग करके url की सूची प्रस्तुत करती है और CSV तैयार आउटपुट में json प्रतिसाद पार्स करता है और htaccess फ़ाइल में मेल खाता नियम। रीडायरेक्ट किए गए url के साथ, स्प्रैडशीट में url की सूची की तुलना करना और यह निर्धारित करना बहुत आसान है कि कौन से नियम काम नहीं कर रहे हैं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.