1

我有几组不同的变量可以是 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]

经过测试,我明白为什么这不起作用但无法弄清楚如何定义不同的集合。

4

1 回答 1

1

根据上面的评论,搜索 URL 是最容易适应的,因为它们以一致的 /search 开头,因此该规则将首先执行:

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. 您需要查看RewriteMap 文档以确定哪种类型最适合您的情况,但最终会是这样的:

#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 表示将传入路径与逗号 ( ^([^,]+)) 之前的所有内容的捕获相匹配,然后匹配 categorymap针对捕获的模式 ( \1)。

于 2013-01-23T23:47:57.947 回答