用于URL重写的可选正则表达式:如何使URL的一部分完全可选?

时间:2011-03-08 04:23:33

标签: regex apache2

关于可选正则表达式的简短问题:

想象一下当前重写/美化的给定页面:

/xx/somepage/description-description-description

实际上将丑陋的网址加载到水下:

/somepage?ln=xx

通过这个看似有效的规则:

RewriteRule ^([a-z][a-z])/(.*)/(.*?)$ /$2?ln=$1 [L]

但是,目前最后一部分/description现在是强制性的。没有它,会发生错误404。我应该使用什么RewriteRule来使第三部分和最后一部分可选?特别是因为它没有文件提取的含义,只是让用户使网址更具描述性。

换句话说,我希望以下三个方面的工作方式相同:

/xx/somepage
/xx/somepage/description-description-description

非常感谢

更新

这两个似乎都很好:

RewriteRule ^([a-z][a-z])/(.*?)(/.*)?$   /$2?ln=$1 [L]
RewriteRule ^([a-z][a-z])/([^/]+)(/.*)?$ /$2?ln=$1 [L]

差异在于中间部分。我认为它与贪婪有关...但是为什么/如何完全不同......其他人可能会在这里发光。

2 个答案:

答案 0 :(得分:2)

删除规则中的最终/,或将其放在可选组中。就目前情况而言,从我看到的情况来看,描述并非完全必要,但是尾部斜线是。

新RegEx:

RewriteRule ^([a-z][a-z])/(.*?)(/.*)?$ /$2?ln=$1 [L]

答案 1 :(得分:1)

您可能需要确保第二个模式不包含斜杠:

RewriteRule ^([a-z][a-z])/([^/]+)(/.*)?$ /$2?ln=$1 [L]