我应该将以下网址转换为用户友好的格式:
example.com/product/$numbers/$anychars => example.com/product.php?product_id=$numbers&name=$anychars
example.com/image/$numbers/$anychars/$number => example.com/image.php?image_id=$numbers&name=$anychars&no=$number
example.com/item/$numbers/$anychars => example.com/item.php?item_id=$numbers&name=$anychars
example.com/category/$anychars => example.com/category.php?name=$anychars
example.com/category/$anychars/$numbers => example.com/category.php?name=$anychars&page=$numbers
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解决方案。
答案 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]