Mod_rewrite и MySql - PullRequest
       5

Mod_rewrite и MySql

1 голос
/ 24 января 2011

У меня есть URL, например. www.example.com/user.php?user_id=9, где поле user_id соответствует одному из ПК в пользовательской таблице. Я не хочу, чтобы URL был таким, вместо этого я хочу, чтобы URL был похож на который может быть использован для создания псевдонима URL.

Мой вопрос

У меня есть все href в форме www.example.com/user.php?user_id=9. Поэтому, чтобы изменить URL-адрес, я полагаю, что мне нужно изменить все ссылки на www.example.com/user/Aditya-Shukla, а для переписывания правила сделать запрос, чтобы получить запись?

Есть ли лучшее решение?

Ответы [ 3 ]

1 голос
/ 24 января 2011

Вы можете добавить RewriteRule, который будет перезаписывать user/Aditya-Shukla в user.php?user_name=Aditya-Shukla и обрабатывать остальное в вашем коде.

RewriteEngine On
RewriteRule ^user/(.*)$ user.php?user_name=$1

Или использовать директиву RewriteMap для поиска имен пользователей, что позволит переписать user/Aditya-Shukla прямо на user.php?user_id=9

1 голос
/ 24 января 2011

Я предполагаю, что на вашем собственном сайте вы всегда будете создавать каноническую форму URL, например:

/user/Aditya-Shukla

... и вам просто придется иметь дело с внешними ссылками, которые не являются каноническимиform, то есть "старые ссылки", такие как:

www.example.com/user.php?user_id=9

mod_rewrite, может не подходить для переназначения в этой ситуации.Я предполагаю, что у вас может быть очень много пользователей, и это число может возрасти.У mod_rewrite есть директива RewriteMap, и да, есть способы динамически генерировать вашу карту, но я не думаю, что это было бы хорошим дизайном (динамически создавать карту userId-to-userName каждый раз, когда ваше правило перезаписи совпадает ...)

Вместо этого вам просто нужно написать свой код user.php, чтобы найти правильное имя пользователя, собрать желаемую каноническую форму URL-адреса и отправить перенаправление обратно клиенту.Что-то вроде:

Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: http://www.example.com/user/Aditya-Shukla" );

Возможно, вам также следует использовать редирект 301 (вместо 302), чтобы указать, что это «постоянное» изменение URL, которое поможет поисковым роботам правильно проиндексировать ваш сайт, если он встретит «URL "старого стиля".

-broc

1 голос
/ 24 января 2011

Нет, у mod_rewrite нет наборов правил перезаписи. Скорее, он предоставляет директивы для построения правил на основе шаблонов регулярных выражений, которые можно комбинировать с дополнительными условиями.

В вашем случае вы должны создать правило, которое принимает любой запрошенный путь URL-адреса, начинающийся с /user/, имеет следующий сегмент пути и переписывает его внутренне в ваш user.php , например:

RewriteEngine on
RewriteRule ^/user/([^/]+)$ /user.php?name=$1

Первая директива RewriteEngine on предназначена только для включения mod_rewrite. И вторая директива RewriteRule … - это правило, описанное выше: ^/user/([^/]+)$ - это шаблон, который соответствует любому URL-пути, начинающемуся с /user/ (т.е. ^/user/), за которым следует один сегмент пути (т.е. ([^/]+)$ ). Затем этот запрос внутренне переписывается в /user.php, в то время как соответствующий сегмент пути за /user/ используется в качестве значения параметра для name параметра ($1 является ссылкой на сопоставленное значение первого группа, обозначенная (…)).

Таким образом, внутренний запрос /user/Aditya-Shukla будет переписан на /user.php?name=Aditya-Shukla. Затем вы можете использовать это имя пользователя и посмотреть его в своей таблице.

...