2013-07-30 86 views
0

我试图找出我怎么能写重写规则htaccess的一个可选的部分。通常我有这个:可选的URL部分重写规则

RewriteRule ^([a-z\-]+)/([A-Za-z\-]+)/([A-Za-z\-]+)/([0-9]+)/([0-9]+)/([0-9]+)\-([A-Za-z0-9\-]+)$ /system.php?lang=$1&category=$2&subcategory=$3&year=$4&month=$5&id=$6&title=$7 [QSA,L] 

它工作正常,如果我有地址例如

http://dev.example.com/en/blog/usa/2013/9/1-title-of-post 

结果是:

$_GET["lang"]="en"; 
$_GET["category"]="blog"; 
$_GET["subcategory"]="usa"; 
$_GET["year"]=2013; 
$_GET["month"]=9; 
$_GET["id"]=1; 
$_GET["title"]="title-of-post"; 

但有时我只是想用类似的地址:

http://dev.example.com/en/about/me 

而且我想这样的:(我的意思是没有定义其它的值,但服务器找到那个地址)

$_GET["lang"]="en"; 
$_GET["category"]="about"; 
$_GET["subcategory"]="me"; 
$_GET["year"]=null; 
$_GET["month"]=null; 
$_GET["id"]=null; 
$_GET["title"]=null; 

所以我希望可选部分从一年开始,但如果有人用年份和其他语句写地址,我想采用它。

谢谢你YOUT帮助!

+0

究竟什么是你想匹配转移后?一点都不清楚。根据什么标准,你希望它匹配什么标准,你希望它不匹配?你是否希望它在域名后面有三个以斜线分隔的部分,可选地后跟一个由三个斜线分隔的数字组成的日期,并且只有在这些情况下,一些附加的东西由连字符与日期分开?我从正则表达式中推断出这一点,但描述并没有说明你想做什么。 –

+0

哦也,做的第一部分一定是小写,而资本被允许以其他方式?这正是正则表达式所要求的。 –

回答

1

基于新的信息,我想我明白你想要做什么。我相信这将工作:

RewriteRule ^([a-z\-]+)/([A-Za-z\-]+)/([A-Za-z\-]+)(/([0-9]+)/([0-9]+)/([0-9]+)-([A-Za-z0-9\-]+))?$ /system.php?lang=$1&category=$2&subcategory=$3&year=$5&month=$6&id=$7&title=$8 [QSA,L] 

注意改变号码的匹配变量($ 1等)。你需要一个一次性的匹配组来使第二部分可选,所以编号跳过一个。今年是现在$ 5,一切由1

+0

感谢您的帮助,并为我的弱规格感到抱歉。我增加了我期望从地址获得的价值。我想在两个地址中显示一些内容(没有404错误),更具体的地址有更多的值。我知道,解决方案可能是写入规则(1长地址和1个短),但今后将是巨大的,有一个规则。 我这样做的网站,我有正常的网页(短地址)和博客,我需要更具体的地址。 希望现在它更清晰,对不起英语是我的第二语言。 – Draq

+0

好吧,现在我想我可以得到这张照片了 - 你想要对捕获组进行什么,以及为什么所有的重复。给我几分钟... –

+0

哦,我爱你!恩,也许不是 - 但是,非常感谢你! :) – Draq