更正.htaccess文件以获取用户友好的URL

时间:2014-01-22 11:39:18

标签: regex apache .htaccess mod-rewrite

我应该将以下网址转换为用户友好的格式:

  1. example.com/product/$numbers/$anychars => example.com/product.php?product_id=$numbers&name=$anychars
  2. example.com/image/$numbers/$anychars/$number => example.com/image.php?image_id=$numbers&name=$anychars&no=$number
  3. example.com/item/$numbers/$anychars => example.com/item.php?item_id=$numbers&name=$anychars
  4. example.com/category/$anychars => example.com/category.php?name=$anychars
  5. example.com/category/$anychars/$numbers => example.com/category.php?name=$anychars&page=$numbers
  6. Web服务器应该允许并忽略尾随斜杠。

    使用互联网上的一些指南,我做了以下工作:

    RewriteEngine On
    RewriteRule    ^product/([0-9]+)/([^/]+)/?$           product.php?id=$1&name=$2                  [QSA,NC,L]
    RewriteRule    ^image/([0-9]+)/([^/]+)/([0-9]+)/?$    image.php?item_id=$1&item_name=$2&no=$3    [QSA,NC,L]
    RewriteRule    ^item/([0-9]+)/([^/]+)/?$              item.php?id=$1&name=$2                     [QSA,NC,L]
    RewriteRule    ^category/([^/]+)/?$                   category.php?cat=$1&page=0                 [QSA,NC,L]
    RewriteRule    ^category/([^/]+)/([0-9]+)/?$          category.php?cat=$1&page=$2                [QSA,NC,L]
    

    指示NC标志使其不区分大小写。 L标志表示在找到一个匹配后停止搜索匹配(更少的错误和更快的URL处理)

    初步测试显示没有错误。 但由于正则表达式和mod_rewrite不是我最好的爱好,我想请你检查我是否没有犯任何错误。如果没有 - 对于像我这样的人来说,它可能是一个很好的模式,可以找到一个简单的mod_rewrite解决方案。

1 个答案:

答案 0 :(得分:3)

我会提出一个建议。按照从最特定匹配到最常规匹配的顺序排列规则(在这种情况下,切换两个类别规则)。通过遵循此约定,您可以确保更具体的规则可以捕获可能满足多个规则的URL。

在你的具体情况下,你不会遇到这个问题,但随着你的规则增长,它最终会咬你。

我没有添加QSA个标记。我建议您创建规则,允许用户查看完全友好的URL,而不是部分友好的URL - 为此,请确保映射其他参数,就像在现有规则中使用ID和类别一样。 / p>

RewriteEngine On
RewriteRule    ^product/([0-9]+)/([^/]+)/?$           product.php?id=$1&name=$2                  [NC,L]
RewriteRule    ^image/([0-9]+)/([^/]+)/([0-9]+)/?$    image.php?item_id=$1&item_name=$2&no=$3    [NC,L]
RewriteRule    ^item/([0-9]+)/([^/]+)/?$              item.php?id=$1&name=$2                     [NC,L]
RewriteRule    ^category/([^/]+)/([0-9]+)/?$          category.php?cat=$1&page=$2                [NC,L]
RewriteRule    ^category/([^/]+)/?$                   category.php?cat=$1&page=0                 [NC,L]