htaccess重写不同的变量集

时间:2013-01-22 00:41:36

标签: .htaccess variables mod-rewrite url-rewriting

我有几组不同的变量,可以是alhpa数字。

如果我注释掉任何两套,那么另一套就可以了。只有一套可以使用但需要全部三套才能工作。

第一组只有一个级别:

domain.com/index.php?var1a=var1a

第二组可以是一级,两级或三级:

domain.com/index.php?var2a=var2a

domain.com/index.php?var2a=var2a&var2b=var2b

domain.com/index.php?var2a=var2a&var2b=var2b&var2c=var2c

第三组可以是一级,两级或三级:

domain.com/index.php?var3a=var3a

domain.com/index.php?var3a=var3a&var3b=var3b

domain.com/index.php?var3a=var3a&var3b=var3b&var3c=var3c

htaccess文件如下所示:

RewriteEngine on
RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?var1a=$1 [L]
RewriteRule ^([a-zA-Z0-9_-]+)/$ index.php?var1a=$1 [L]

RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?var2a=$1 [L]
RewriteRule ^([a-zA-Z0-9_-]+)/$ index.php?var2a=$1 [L]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)$ index.php?var2a=$1&var2b=$2 [L]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/$ index.php?var2a=$1&var2b=$2 [L]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)([a-zA-Z0-9_-]+)/$ index.php?var2a=$1&var2b=$2&var2c=$3 [L]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/$ index.php?var2a=$1&var2b=$2&var2c=$3 [L]

RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?var3a=$1 [L]
RewriteRule ^([a-zA-Z0-9_-]+)/$ index.php?var3a=$1 [L]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)$ index.php?var3a=$1&var3b=$2 [L]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/$ index.php?var3a=$1&var3b=$2 [L]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)$ index.php?var3a=$1&var3b=$2&var3c=$3 [L]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/$ index.php?var3a=$1&var3b=$2&var3c=$3 [L]

经过测试,我理解为什么这不起作用,但无法解决如何定义不同的集合。

1 个答案:

答案 0 :(得分:1)

根据上面的评论,搜索网址最容易适应,因为它们以一致/搜索开头,因此该规则将首先出现:

RewriteRule ^search/?$ index.php?search=true [L, NC]
RewriteRule ^search/([a-zA-Z0-9_-]+)/?$ index.php?search=true&keyword=$1 [L, NC]
RewriteRule ^search/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?search=true&keyword=$1&keyword2=$2 [L, NC]

/?使得尾部斜杠可选,因此您可以匹配或不匹配相同的规则。

留下联盟和帖子链接。假设帖子链接有各种起始术语(类别),与“搜索”不同,我们需要将它们与用户名区分开来。但是,用户名只有一个级别,所以首先我们可以捕获任何两个或三个级别的URL作为帖子链接:

RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?c=$1&m=$2 [L, NC]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?c=$1&m=$2&t=$3 [L, NC]

最后,对于用于区分类别和用户名的单级URL,可能的情况是,有少数已知类别在用户名更多且更容易发生变化时不经常更改。因此,您需要一个类别的查找方法,然后默认任何不匹配的用户名。

要查找类别,您需要使用RewriteMap。您需要查看the RewriteMap documentation以确定哪种类型最适合您的情况,但最终会出现这样的情况:

#Map is declared in virtual host context, not in .htaccess
RewriteMap categorymap txt:/path/to/file/categories.txt

RewriteCond ^([a-zA-Z0-9_-]+)/?$,${categorymap:$1} ^([^,]+),\1
RewriteRule ^([a-zA-Z0-9_-]+)/?$ index.php?c=$1

RewriteRule ^([a-zA-Z0-9_-]+)/?$ index.php?affiliate=$1

我没有自己使用RewriteMaps或者使用那种特定格式的RewriteConds,所以它可能需要调整,但想法是RewriteCond说要匹配传入路径以捕获一切直到逗号({{1}然后将类别映射与捕获的模式(^([^,]+))进行匹配。