apachemod-rewriterewritemap

Apache RewriteRule with RewriteMap


I've got a RewriteMap that looks like this:

Guide           1
Mini-Guide      2
White Paper     3

and I'm including it into Apache via

RewriteMap legacy txt:/var/www/site/var/rewrite_map.txt

I want to create a RewriteRule that will allow only values from the left side of said RewriteMap to be in this position;

RewriteRule ^/section/downloads/(${legacy})/(.*)$ /blah.php?subsection=${legacy:%1}&title=$2

I know I can use ${legacy} on the right side, but can I use it on the left, and if so, how?


Solution

  • In your map file, the left side is the key and the right side is the value. When you create a rule for matching against a map, you input the key and it outputs the value.

    Change your RewriteRule to this:

    # Put these on one line
    RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
                /blah.php?subsection=${legacy:$1}&title=$2
    

    The first grouping captures the string in the incoming URL. The $1 in the replacement applies it to the named map. To make a default value, change ${legacy:$1} to ${legacy:$1|Unknown}.

    Finally, if you only want the rule to work on values that are in the map file, add a RewriteCond:

    RewriteCond ${legacy:$1|Unknown} !Unknown
    # Put these on one line
    RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
                /blah.php?subsection=${legacy:$1}&title=$2
    

    The condition says if the map does not return the default value (Unknown), then run the next rule. Otherwise, skip the rule and move on.

    Apache RewriteMap