【问题标题】:Rewriting url having more than one url parameter重写具有多个 url 参数的 url
【发布时间】:2014-04-21 13:33:01
【问题描述】:
一直在研究如何使用htaccess文件重写url。经过大量时间投入,我仍然对如何重写 url 有一个非常模糊的概念。
基本上,我有一个网址:
http://mehthesheep.com/bali/jimbaran/blue-point/1
我想改写成:
http://mehthesheep.com/countries/hotel.php?hotel_id=1&state=bali&city=jimbaran
如何在 url 中包含多个参数?
任何简单解释的帮助将不胜感激!
【问题讨论】:
标签:
php
apache
.htaccess
mod-rewrite
url-rewriting
【解决方案1】:
所以 apache 不是我最强的技能,但据我了解,您重写 url 的方式是使用 mod rewrite,并且在您的正则表达式中,每个匹配参数都可以映射到其他东西。所以像:
#1st field #match 2
RewriteRule ^/hotel/(.*)/(.*) http://www.example.com/hotel.php?hotel_id=$2&state=$1 [NC,QSA,L]
#2nd field #match 1
我的语法可能是错误的,所以我很抱歉,但要点是我可以采用模式,然后将匹配项对应到我的重写 url 中的 '$n' 键。在上面的示例中,对 /hotel/bali/1 的调用将重写为 hotel.php?hotel_id=1&state=bali。不确定它是否重要,但我使用了一个非常简单的匹配 '(.*)' 基本上意味着任何东西。
最后一位 w/ 是您可以添加的标志,以确保获得所需的行为。 QSA 允许附加查询字符串,以防您有跟踪或其他参数进入,NC 使匹配不区分大小写,以防他们尝试 /Hotel 之类的操作。 L 是最后一个,意味着如果规则匹配,这是要评估的最后一个规则,因此执行重写(或类似的东西)。
希望对您有所帮助。这真的帮助我深入研究了 mod rewrite:
http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
【解决方案2】:
将此代码放入您的DOCUMENT_ROOT/.htaccess 文件中:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ /countries/hotel.php?hotel_id=$4&state=$1&city=$2 [L,QSA]