我有几组不同的变量,可以是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]
经过测试,我理解为什么这不起作用,但无法解决如何定义不同的集合。
答案 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}然后将类别映射与捕获的模式(^([^,]+)
)进行匹配。