mod_rewrite电子商务网址设计

时间:2009-08-20 08:57:42

标签: apache url .htaccess mod-rewrite

我在如何构建产品详情页面,产品页面,网页时遇到问题。

大致转化为:

  1. /bags/nicebag.html = /product.php?product=nicebag&category=bags
  2. /nicebag.html = /product.php?product=nice_bag
  3. /bags = productlisting.php?&category=bags
  4. 问题是网页将与列表中的第2个共享相同的URL结构 /contact.html = page.php?page=contact

    它没有单独列在.htaccess中的原因是网页可以有不同的名称。甚至同一页面也可以使用多种语言。

    没有的原因。 1和2没有结合,有时我只想引用产品,因为它可以分为多个类别。

    你建议采用什么样的结构?

    的.htaccess

    # Mod rewrite enabled.
    Options +FollowSymLinks
    RewriteEngine on
    
    # ---- Rules ----
    
    # product.php (Search for category & product name)
    RewriteRule ^([A-Za-z0-9-_]+)/([A-Za-z0-9-_]+)\.html?$ product.php?prod_id=$2&cid=$1 [NC,L]
    
    # productlisting.php (Search for category)
    RewriteRule ^([A-Za-z0-9-_]+)?$ productlisting.php?&cid=$1 [NC,L]
    

6 个答案:

答案 0 :(得分:4)

我会使用路径前缀/products/来识别与产品相关的URL。所以:

  • /products/bags/nicebag.html/product.php?product=nicebag&category=bags
  • /products/nicebag.html/product.php?product=nice_bag
  • /products/bags/productlisting.php?&category=bags

使用这样的结构,您还可以将/products/重写为/productlisting.php,然后显示所有产品。

# product listing
RewriteRule ^products/$ productlisting.php [L]
RewriteRule ^products/([A-Za-z0-9-_]+])$ productlisting.php?category=$1 [L]
# product details
RewriteRule ^products/([A-Za-z0-9-_]+)\.html$ product.php?prod_id=$1 [L]
RewriteRule ^products/([A-Za-z0-9-_]+)/([A-Za-z0-9-_]+)\.html$ product.php?prod_id=$2&cid=$1 [L]
# other pages
RewriteRule ^([A-Za-z0-9-_]+)\.html$ page.php?page=$1 [L]

答案 1 :(得分:2)

因为在.htaccess文件中维护你的重写规则会很麻烦和麻烦,我只会在其中放一条规则,重写为:

/dispatch.php?request=[request]

e.g。

RewriteRule ^(.*)$ dispatch.php?request=$1 [L,QSA]

在dispatch.php中,您将请求分解为其元素(路径,查询字符串,锚点,...)并决定从那里开始。这样,您可以使用代码进行决策制定,这将比仅维护大量自定义重写映射提供更多灵活性。

例如,您可以通过查询数据库来识别路径中的产品和类别元素,并以更通用的方式将调度逻辑基于结果。

[Pseudocode]
if (isProduct($lastPathElement)) {
  // Maybe verify that leading path elements are categories ...
  // Other preparations/verifications ...
  // refer execution to product.php
}
elseif (isCategory($lastPathElement)) {
  // Other preparations/verifications ...
  // refer execution to productlisting.php
}
// ... (Checks for other specific stuff)
else {
  // Static page or 404
  // refer execution to page.php
}

答案 2 :(得分:2)

为不同的类型使用不同的后缀,例如产品的html和页面的htm或类似的东西

/bags/nicebag.html = /product.php?product=nicebag&category=bags
/nicebag.html = /product.php?product=nice_bag
/bags = productlisting.php?&category=bags
/contact.htm = page.php?page=contact

/contact/page.html = page.php?page=contact

答案 3 :(得分:0)

几周前我正面对同样的问题。 结束为“静态”页面定义不同的结构。

www.examples.com/contact/ 要么 www.examples.com/info/contact.html

因此可以将其与“动态”页面区分开来。

答案 4 :(得分:0)

在没有将非产品网页名称放在.htaccess中或在接收php脚本中进行一些初步处理的情况下,几乎没有办法区分www.examples.com/nicebag.html和www.examples.com/contact.html

如我所见,选项包括:

  1. 重写对page.php的所有请求以及与任何非产品页面不匹配的请求,包括产品脚本

  2. 动态地将非产品页面名称写入.htaccess(凌乱且容易出错)

  3. 重新考虑非产品页面的网址结构。也许只有www.example.com/page/contact.html可以提供帮助

  4. 无论如何,我会选择第三个。

答案 5 :(得分:0)

我推荐扁平结构:

  • domain.com/bags
  • domain.com/contact
  • domain.com/nice-bag