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

Apache Htaccess重写URL问题:如何区分列表和详细页面,apache,mod-rewrite,Apache,Mod Rewrite,我正在开发一个商业网站,在那里用户可以发布任何类别的项目(类别可以是2到4级) 我想为列表和详细信息页面生成URL: 列表页面将显示内部类别中的项目列表 详细信息页面将显示内部类别中项目的所有信息 (内部类别是指层次结构中的最后一个类别,即/classified/autos4x4s/mitsubishi/lancer/内部平均值“lancer”) 以下是我想要生成的链接 /classified/autos4x4s/mitsubishi/lancer/(用于上市) /classified/au

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

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

  • 列表页面将显示内部类别中的项目列表
  • 详细信息页面将显示内部类别中项目的所有信息 (内部类别是指层次结构中的最后一个类别,即
    /classified/autos4x4s/mitsubishi/lancer/
    内部平均值“lancer”)
以下是我想要生成的链接

  • /classified/autos4x4s/mitsubishi/lancer/
    (用于上市)

  • /classified/autos4x4s/mitsubishi/lancer/2011/3/12/lancer-2002-in-good-condition-14/
    (详细信息)

  • 如果URL中只存在4个类别,我想重定向到ads.php;如果传递了6个项目(4个类别名称+2个日期和标题),我想重定向到detail.php

    我写这些规则:

    #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/

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


    任何帮助都将不胜感激。

    请注意正则表达式部分:

    (.*)/(.*)/(.*)/(.*)/(.*)/(.*)
    
    点也将匹配“/”,因此对于某些URL,这将导致可能匹配的组合爆炸,使得重写效率非常低。请考虑写这篇文章中的任何一个:

    (\w+)/(\w+)/(\w+*)/(\w+*)/(\w+*)/(\w+*)
    ([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)
    
    您的问题也与此相关:包含6个“/”字符的url也将与您的4倍斜杠模式匹配(因为.matches/也是)

    你能试试吗

    #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]
    

    好的,老师,让我知道,怎么接受?现在有什么帮助吗?提前感谢。点击应答器旁边的复选标记图标www.example.com/classified/autos4x4s/mitsubishi/lancer/2011/3/12/lancer-2002-in-good-condition-14/(详情)如下:www.example.com/classified/autos4x4s/mitsubishi/lancer/2011-3-12/lancer-2002-in-good-condition-14/(详情)由于date是一个单独的实体,感谢您的回复,我已经将其更改为/([^/]+)。现在,由于详细页面url包含日期,所以我通过编写url中日期值的Tconditio检查来解决这个问题。RewriteCond%{REQUEST_URI}/(.*)/././([0-9]{4}-[0-9]{2}-[0-9]{2}/(.*)/.*RewriteRule^([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/)/([^/]*)/)/?$detail.php?$detail.php?&dt=%2&at=%3&c1=$2&c2=$c3=$c3=$3=$c4,尝试将$1/$2/$4重新定向,但未能将其作为页面的工作条件,但不包括在上面的列表中,收到“未找到页面”错误。重写cond%{REQUEST_URI}/(.*)/.*/([0-9]{4}-[0-9]{2}-[0-9]{2})/(.*)/.*重写规则^([^/]*)/([^/]*)/([^/]*)/([^/]*)/?([^/]*)/?$ads.php?c1=$1和c2=$2和c3=$3和c4=$4[NC,L]但不起作用,请帮助.Hmmm。你的话很难懂。如前所述,不建议在模式中使用多个。*部分。我不明白你为什么用?在您的模式([^/]*)/?([^/]*)/?)中,这是一个坏主意,因为现在您将/设置为可选,并且许多组合再次成为可能…是的,您是对的,它会产生一些其他问题,但我想再次指出,由于这里没有所见即所得编辑器,因此很难阅读。我想做到这一点。我想从我的sitename开始,然后是sitename\cars\,然后是sitename\cars\honda\,然后是sitename\cars\honda\Civic\等等。这是一种平稳的方式,详细信息sitename\cars\honda\Civic\2011-04-07\待售优秀汽车\日期和标题也是如此。
    #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]