Можно ли использовать mod_rewrite htaccess, чтобы переписать URL-адрес от имени к идентификатору. - PullRequest
3 голосов
/ 22 августа 2011

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

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

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 22 августа 2011

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

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

отображается на

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

Вот как я использую текстовые файлы карты, которые я генерирую из запроса к базе данных.Я считаю, что mod_rewrite также выполняет сопоставление с базой данных напрямую, о которой я незнаком (возможно, кто-то может дать такой ответ).Я использую isapi_rewrite v3 от Helicon Tech, которая работает как 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, а затем переписывает его в ваш список list.php.${map_company:$1} ищет URL-адрес в файле карты и возвращает идентификатор.

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

1 голос
/ 22 августа 2011

Вам понадобится идентификатор в обоих 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 и проверить равенство в listings.php

...