是否可以使用mod_rewrite htaccess将url从名称重写为id


Is it possible to use mod_rewrite htaccess to rewrite a url from name to id.

如果我有一个URL http://www.domain.com/listing.php?company_id=1,我是否可以通过使用该id从数据库中提取名称来将其重写为http://www.domain.com/company-name

或者我必须更改listing.php使其成为?company_name=company-name

如果有人能给我指出正确的方向,那就太好了。

谢谢!

map函数允许在url中完全不使用id,同时仍然使用重写url中的id进行数据库查找。

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

映射到

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

下面是我如何使用从数据库查询生成的map文本文件。我相信mod_rewrite也直接映射到数据库,这是我不熟悉的(也许有人可以提供答案)。我使用Helicon Tech的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的变量(命名相同只是为了保持一致)。

rewriterrule正在工作。它捕获$1中斜杠之后的所有内容,然后将其重写为您的listing.php url。${map_company:$1}在映射文件中查找url,并返回id。

RewriteCond只是重复检查列表是否在那里。$1来自RewriteRule url,如果没有找到,则NOT_FOUND是默认值,而条件是它不是NOT_FOUND(有点纠结-但它只是检查它是否在文件中)。如果它在文件中,则将运行RewriteRule。如果不在文件中,它将跳过rewriterrule,并通过更多规则(可能是page-not-found或其他默认值)。

在两个url中都需要id,但在漂亮的链接中只使用用户的全名。下面的代码将把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

是否相等