PHP .htaccess -> pretty url (in reverse)

后端 未结 2 1190
半阙折子戏
半阙折子戏 2020-12-05 16:37

I know how to make URL\'s rewrite, for example: www.example.com/index.php?id=1&cat=3 to www.example.com/1/3/ (or whatever). I know that.

相关标签:
2条回答
  • 2020-12-05 17:12
    RewriteEngine on
    
    # Prevents browser looping, which does seem
    #   to occur in some specific scenarios. Can't
    #   explain the mechanics of this problem in
    #   detail, but there we go.
    RewriteCond %{ENV:REDIRECT_STATUS} 200
    RewriteRule .* - [L]
    
    # Hard-rewrite ("[R]") to "friendly" URL.
    # Needs RewriteCond to match original querystring.
    # Uses "?" in target to remove original querystring,
    #   and "%n" backrefs to move its components.
    # Target must be a full path as it's a hard-rewrite.
    RewriteCond %{QUERY_STRING} ^id=(\d+)&cat=(\d+)$
    RewriteRule ^index\.php$ http://example.com/index/%1/%2/? [L,R]
    
    # Soft-rewrite from "friendly" URL to "real" URL.
    # Transparent to browser.
    RewriteRule ^index/(\d+)/(\d+)/$ /index.php?id=$1&cat=$2
    

    Of course, ideally, you'd just fix your links, and then you'd only require the soft-rewrite. :)

    Tested with Apache/2.2.3. I think I made up the terms "hard-rewrite" and "soft-rewrite".

    0 讨论(0)
  • 2020-12-05 17:13

    Why not just change your index.php file to do it? You could theoretically do a little more error checking that way, allowing for the variables to be in any order and still get routed to the correct end location.

    <?php
        // Permanent redirection
        header("HTTP/1.1 301 Moved Permanently");
        header("Location: http://www.example.com/{$_GET['id']}/{$_GET['cat']}");
    

    I didn't do any error checking here, but wanted to give a base example.

    On second thought I guess this is adding in functionality to the index.php file which you then want to use for your application itself, so perhaps it would end up confusing the functionality in the code.

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