Tips for debugging .htaccess rewrite rules

后端 未结 16 3146
萌比男神i
萌比男神i 2020-11-21 05:17

Many posters have problems debugging their RewriteRule and RewriteCond statements within their .htaccess files. Most of these are using a shar

相关标签:
16条回答
  • 2020-11-21 05:54

    (Similar to Doin idea) To show what is being matched, I use this code

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

    Save it to r.php on the server root and then do some tests in .htaccess
    For example, i want to match urls that do not start with a language prefix

    RewriteRule ^(?!(en|de)/)(.*)$ /r.php?$1&$2 [L] #$1&$2&...
    RewriteRule ^(.*)$ /r.php?nomatch [L] #report nomatch and exit
    
    0 讨论(0)
  • 2020-11-21 05:56

    Make sure you use the percent sign in front of variables, not the dollar sign.

    It's %{HTTP_HOST}, not ${HTTP_HOST}. There will be nothing in the error_log, there will be no Internal Server Errors, your regexp is still correct, the rule will just not match. This is really hideous if you work with django / genshi templates a lot and have ${} for variable substitution in muscle memory.

    0 讨论(0)
  • 2020-11-21 05:58

    Make sure that the syntax of each Regexp is correct

    by testing against a set of test patterns to make sure that is a valid syntax and does what you intend with a fully range of test URIs.

    See regexpCheck.php below for a simple script that you can add to a private/test directory in your site to help you do this. I've kept this brief rather than pretty. Just past this into a file regexpCheck.php in a test directory to use it on your website. This will help you build up any regexp and test it against a list of test cases as you do so. I am using the PHP PCRE engine here, but having had a look at the Apache source, this is basically identical to the one used in Apache. There are many HowTos and tutorials which provide templates and can help you build your regexp skills.

    Listing 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>
    
    0 讨论(0)
  • 2020-11-21 05:59

    Online .htaccess rewrite testing

    I found this Googling for RegEx help, it saved me a lot of time from having to upload new .htaccess files every time I make a small modification.

    from the site:

    htaccess tester

    To test your htaccess rewrite rules, simply fill in the url that you're applying the rules to, place the contents of your htaccess on the larger input area and press "Check Now" button.

    0 讨论(0)
提交回复
热议问题