重写可能包含或不包含多个斜杠的URL

时间:2013-10-05 03:56:29

标签: regex .htaccess mod-rewrite

我正在尝试构建一个URL重写规则,该规则将处理mysite.com/categoryName/mysite.com/categoryName/productName/等网址,并将其路由到单独的处理程序。在我的.htaccess文件中,如果我使用:

RewriteRule shop/(.*^/)/$ view.php?mode=category&id=$1
RewriteRule shop/(.*)/(.*)/$ view.php?mode=product&id=$2

产品页面正确重写,但类别网址会产生400.如果我使用:

RewriteRule shop/(.*[^/])/$ view.php?mode=category&id=$1
RewriteRule shop/(.*)/(.*)/$ view.php?mode=product&id=$2

相反的情况发生(类别页面显示,但产品页面上显示400s)。

我无法判断这是否是我的RegEx(最有可能)的问题,一些URL必须由两个规则检查,或者可能有一种方法可以使用单个规则进行两次重写。任何投入将不胜感激。提前谢谢!

1 个答案:

答案 0 :(得分:3)

使用点.通常是非明确意图的不良信号,可能令人困惑。而且,它是贪婪的,所以这增加了混乱。相反,在第二个例子中使用类似于你的东西......

([^/]+)这意味着“所有不在被否定的字符类[^...]中的东西,在这种情况下只是斜线。重复无限次,需要(我建议需要+对于URL):

RewriteRule shop/([^/]+)/$ view.php?mode=category&id=$1
RewriteRule shop/([^/]+)/([^/]+)/$ view.php?mode=product&id=$2

我还会看到在查看重写产品规则时处理类别时可能出现的问题。要100%确定,你应该像这样处理它:

RewriteRule shop/([^/]+)/$ view.php?category=$1
RewriteRule shop/([^/]+)/([^/]+)/$ view.php?category=$1&product=$2

但这可能是偏离主题的。