Htaccess重写URL问题:如何区分列表和详细信息页面

时间:2011-03-15 08:07:03

标签: apache mod-rewrite

我正在开发一个商业网站,用户可以在任何类别中发布项目(类别可以是2到4个级别)。

我想为列表和详细信息页面生成网址:

  • 列表页面将显示内部类别
  • 中的项目列表
  • 详细信息页面将显示内部类别中项目的所有信息 (内部类别表示层次结构中的最后一个类别,即/classified/autos4x4s/mitsubishi/lancer/内部均值“lancer”)

以下是我想要生成的链接

  1. /classified/autos4x4s/mitsubishi/lancer/(上市)

  2. /classified/autos4x4s/mitsubishi/lancer/2011/3/12/lancer-2002-in-good-condition-14/(详情)

  3. 如果网址中只有4个类别,我想重定向到ads.php,如果传递了6个项目,我想重定向到detail.php(4个类别名称+ 2个日期和标题)。

    我写下这些规则:

    #listing ads
    RewriteRule ^(.*)/(.*)/(.*)/(.*)/?$ ads.php?c1=$1&c2=$2&c3=$3&c4=$4 [NC,L]
    
    #Detail pages
    RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/?$ detail.php?c1=$1&c2=$2&c3=$3&c4=$4&dt=$5&at=$6 [NC,L]
    

    但所有网站页面都会重定向到ads.php(列表页面)甚至主页。

    我更改规则如下:(即使我不想在URL的开头使用列表和详细信息。为什么我在某个网站上看到我想要的内容:/classified/autos4x4s/mitsubishi/lancer/2011/3/12/lancer-2002-in-good-condition-14/

    #Listing pages
    RewriteRule ^Listing/(.*)/(.*)/(.*)/(.*)/?$ ads.php?c1=$1&c2=$2&c3=$3&c4=$4 [NC,L]
    
    #Detail pages
    RewriteRule ^Detail/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/?$ detail.php?c1=$1&c2=$2&c3=$3&c4=$4&dt=$5&at=$6 [NC,L]
    

    现在所有其他页面都很好,但是当我通过/classified/autos4x4s/mitsubishi/lancer/2011/3/12/lancer-2002-in-good-condition-14/时,它总是转到列表页面(ads.php)而不是详细页面。

    任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

请注意正则表达式部分:

(.*)/(.*)/(.*)/(.*)/(.*)/(.*)

点也将匹配'/',因此对于某些URL,这会导致可能匹配的组合爆炸,使得重写效率非常低。请考虑将这部分写成以下任何一部分:

(\w+)/(\w+)/(\w+*)/(\w+*)/(\w+*)/(\w+*)
([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)

您的问题也与此相关:包含6个/'字符的网址也将与您的4次斜杠模式匹配(因为。匹配/也是)

你可以尝试一下:

#Listing pages
#e.g. /classified/autos4x4s/mitsubishi/lancer/
RewriteRule ^(\w+)/(\w+)/(\w+)/(\w+)/$ ads.php?c1=$1&c2=$2&c3=$3&c4=$4 [NC,L]

#Detail pages
#e.g. /classified/autos4x4s/mitsubishi/lancer/2011/3/12/lancer-2002-in-good-condition-14/ 
RewriteRule ^(\w+)/(\w+)/(\w+)/(\w+)/(\d+/\d+/\d+)/([^/]+)/$ detail.php?c1=$1&c2=$2&c3=$3&c4=$4&dt=$5&at=$6 [NC,L]