在apache中压缩重写规则

时间:2015-11-19 18:41:31

标签: apache .htaccess mod-rewrite

这些是我的重写规则。第一条规则是有问题的,它是我试图实现的目标。最后四项工作,但这太过分了。

RewriteRule ^([^/^.]+)/([0-9]{4})([a-z]{3})([0-9]{2})/p(([0-9]{1,5})-([0-9]{1,3}))?$ /test2-$1-$2-$3-$4-$5-$6


RewriteRule ^([^/^.]+)/([0-9]{4})([a-z]{3})([0-9]{2})/p([0-9]{1,5})-([0-9]{1,3})$ /test-$1-$2-$3-$4-$5-$6
RewriteRule ^([^/^.]+)/([0-9]{4})([a-z]{3})([0-9]{2})/p([0-9]{1,5})-$ /test-$1-$2-$3-$4-$5
RewriteRule ^([^/^.]+)/([0-9]{4})([a-z]{3})([0-9]{2})/p([0-9]{1,5})$ /test-$1-$2-$3-$4-$5
RewriteRule ^([^/^.]+)/([0-9]{4})([a-z]{3})([0-9]{2})/p$ /test-$1-$2-$3-$4

我尝试做的是使用一个重写而不是四个来处理以下格式的网址:

http://example.com/word/####wor##/p#-###
http://example.com/word/####wor##/p#-
http://example.com/word/####wor##/p#
http://example.com/word/####wor##/p

有什么方法可以将我的重写浓缩为一个而不是四个?

如有必要,我稍后会添加更多信息。

1 个答案:

答案 0 :(得分:0)

可能有更优雅的方法来解决这个问题,但以下情况应该有效:

function()

要打破它:

第一部分是你到目前为止所做的事情。它涵盖了捕获结果RewriteRule ^([^/^.]+)/([0-9]{4})([a-z]{3})([0-9]{2})/p(?:([0-9]{1})|([0-9]{1})-|([0-9]{1})-([0-9]{3})){0,1}$ /test-$1-$2-$3-$4-$5-$6-$7-$8 [L,NC] $1

接着是$4,后面是一个大组,它被分成几个用管道符/p分隔的轮换。该组中包含的其中一个选项应匹配零次或一次|

此组开头的/p(?:...|...|...){0,1}表示整个组不应该用于捕获,因为您不一定要捕获最终结果(例如它包含{{ 1}}),所以我们坚持只捕获相关的子组。这也意味着,在对捕获组进行计数以了解哪些变量转换为哪个变量(?:-等)时,您将不会计算此组。

这些替换符合您为网址提供的3种变体,其中$1后面跟着其他内容:

$2


请注意,在最终结果/p中,并非所有变量都可能匹配某些内容,具体取决于您的网址格式。有些可能仍然是空的。