Можно ли использовать mod_rewrite htaccess для перезаписи URL-адреса от имени к id.

Если у меня есть URL http://www.domain.com/listing.php?company_id=1 , то я могу переписать его на http://www.domain.com/company-name , используя этот идентификатор вытащить имя из базы данных.

Или мне нужно изменить listing.php, чтобы сделать это ?company_name=company-name

Если кто-то может указать мне в правильном направлении, это было бы здорово.

Благодаря!

Функция карты позволяет без использования идентификатора в URL-адресе, но при этом используется идентификатор в переписанном URL-адресе для поиска базы данных.

 http://www.domain.com/another-one 

карты для

 http://www.domain.com/listing.php?company_id=3423 

Вот как я использую текстовые файлы карты, которые я генерирую из запроса к базе данных. Я считаю, что mod_rewrite также делает сопоставление непосредственно с базой данных, из которых я незнакомый (может быть, кто-то может предоставить этот ответ). Я использую Helicon Tech's isapi_rewrite v3, который работает как mod_rewrite, поэтому это должно сработать для вас.

Пример файла карты с именем map_company.txt

 some-company 12 another-one 3423 freds-fill-dirt-and-croissants 44 

Правила перезаписи:

 RewriteMap map_company txt:map_company.txt [NC] RewriteCond ${map_company:$1|NOT_FOUND} !NOT_FOUND RewriteRule ^/(.*) /listing.php?company_id=${map_company:$1} [NC,QSA,L] 

RewriteMap присваивает текстовому файлу map_company.txt переменную с именем map_company (названной так же, чтобы быть последовательной).

RewriteRule выполняет работу. Он захватывает все после косой черты в $1 , а затем переписывает его на ваш URL-адрес listing.php. ${map_company:$1} ищет URL-адрес в файле карты и возвращает идентификатор.

RewriteCond просто выполняет двойную проверку, чтобы увидеть, есть ли листинг. $ 1 поступает с URL-адреса RewriteRule, NOT_FOUND – это значение по умолчанию, если оно не найдено, и условие есть, если оно не является NOT_FOUND (немного запутано, но это просто проверка, находится ли он в файле). Если он находится в файле, RewriteRule будет запущен. Если он не находится в файле, он пропускает RewriteRule и переходит к большему количеству правил (возможно, к не найденной странице или к другому по умолчанию).

Вам потребуется идентификатор в обоих URL-адресах, но используйте только полное имя в симпатичной ссылке для пользователя. Следующее переписало бы http://www.domain.com/42/company_name на http://www.domain.com/listing.php?company_id=42 и просто отмените название компании.

 RewriteEngine on RewriteRule ^([0-9]*)/([A-Za-z0-9_]*)/$ /listing.php?company_id=$1 [L] 

Обратите внимание, что пользователь также может посетить http://www.domain.com/42/wrong_name и по-прежнему приземляться на правой странице с правильным названием компании. Если это нежелательно, вы можете изменить правило на /listing.php?company_id=$1&company_name=$2 и проверить равенство в /listing.php?company_id=$1&company_name=$2