использование Apache mod rewrite для разбора SEO дружественных URL-адресов


Как мне преобразовать что-то вроде

me.com/profile/24443/quincy-jones

К

me.com/profile.php?id=24443

Или что-то вроде

me.com/store/24111/robert-adams

К

me.com/store.php?id=24111

С mod_rewrite?

Могу ли я сделать обратное преобразование также с mod_rewrite, или мне придется разбирать его через PHP?

2 3

2 ответа:

Это должно работать для обоих:

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

Пояснение:

^           - 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

Вы также можете сделать его более точным, так что только два запроса переписываются и только цифры принимаются в качестве идентификатора:

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

Убедитесь, что модуль mod_rewrite apache включен, затем:

RewriteEngine on

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

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

Вы, вероятно, захотите обработать обратное условие в PHP, особенно с конечной частью имени (так как этого нет в исходном URL). Если вы хотите обработать его в mod_rewrite без имени, убедитесь, что вы не закончите в двойном переписывании (зависит от порядка ваших правил). Кроме того, вы можете использовать переключатель [L] (last), чтобы сделать правило последним (последующие правила будут пропущены, если есть совпадение).

Кроме того, можно сделать более общее правило перезаписи, но вам нужно будет тщательно продумать другие URL-адреса, которые могут быть затронуты.