如果我有一个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