这些是我的重写规则。第一条规则是有问题的,它是我试图实现的目标。最后四项工作,但这太过分了。
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
有什么方法可以将我的重写浓缩为一个而不是四个?
如有必要,我稍后会添加更多信息。
答案 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
中,并非所有变量都可能匹配某些内容,具体取决于您的网址格式。有些可能仍然是空的。