2013-01-22 32 views
1

我有几个不同的变量集可以是数字的。htaccess为不同的变量集重写

如果我注释掉任何两组,另一组将会工作。只有一套可以工作,但需要全部三套才能工作。

第一组是唯一的一层:

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

您在所有三组中定义了相同的匹配 - 实际的原始URL如何不同?写它的方式,就像你希望Apache神奇地知道'domain.com/guesswhat'是否应该进入规则1,2或3。请给出一些示例URL来区分应如何使用这三条规则。 –

+0

第一个是子公司,因此它的: –

+0

ooops ....第一个是子公司所以它:domain.com/?affiliate=username。其次是发布后的domain.com/?c=cat&m=month&t=tile等,第三个类似于第二次使用搜索术语和标签的硬编码链接domain.com/?search=true&keyword=word&keyword2=word2。类似的东西,如果我可以让重写以这种方式工作 –

回答

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] 

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

这留下子公司和张贴链接。假设帖子链接有各种各样的起始词(类别),与“搜索”不同,我们需要区分用户名。用户名只能有一个级别,虽然如此,首先我们可以捕捉任意两种或三种级别的网址为帖子的链接:

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)进行匹配。

+0

非常感谢您的帮助。它现在都在工作,但我无法在RewriteMap中找到我的头,所以我使用这条线添加了/ id /到url,RewriteRule^id /([a-zA-Z0-9 _-] +)/?$ index .php?affiliate = $ 1如果客户对此感到满意,我会放弃它,否则我会更多地研究RewriteMap。谢谢! –

+0

是的,如果您可以选择使URL的第一部分保持一致,那么与绘图相比,这将始终更易于使用。 –

+0

我明白现在重写规则,从来没有真正想过,因为大多数工作是wordpress或magento所以不必考虑。客户很满意会员网址为domain.com/id/username,所以都很好!谢谢你的帮助 :-) –