views:

493

answers:

2

Hi -

How do I convert something like

me.com/profile/24443/quincy-jones

to

me.com/profile.php?id=24443

or something like

me.com/store/24111/robert-adams

to

me.com/store.php?id=24111

with mod_rewrite?

Can I make the reverse conversion as well with mod_rewrite, or would I have to parse it through PHP?

+2  A: 

This should work for both:

RewriteEngine on
RewriteRule ^([^/]+)/([^/]+).*$ $1.php?id=$2 [L]

Explanation:

^           - beginning of the string
([^/])      - first group that doesn't contain /
              will match both 'profile' and 'store'
              will also be referenced by $1 later
/           - first slash separator
([^/])      - second group, id in your case
              will be referenced by $2
.*          - any ending of the request uri
$           - end of request string

You can also make it more precise so only the two request are rewritten and only digits are accepted as id:

RewriteRule ^((profile|store))/(\d+).*$ $1.php?id=$2 [L]
Michal M
+1  A: 

Make sure you have the mod_rewrite apache module enabled, then:

RewriteEngine on

RewriteRule ^/profile/(.)/(.)$ /profile.php?id=$1 [L]

RewriteRule ^/store/(.)/(.)$ /store.php?id=$1 [L]

You will probably want to handle the reverse condition in PHP, especially with the trailing name part (since that is not in the original URL). If you want to handle it in mod_rewrite without the name, make sure that you do not end up in a double rewrite (depends on the order of your rules). Also, you can use the [L] (last) switch to make the rule the last one used (subsequent rules will be skipped if there is a match).

Also, it is possible to make a more generic rewrite rule, but you will need to carefully think about other URLs that might be affected.

jonstjohn