调度器的regex匹配大小写,然后将url的部分内容改为小写。

问题描述 投票:0回答:1

假设我有一个产品页面 /GB/en/cat/product/abc/cde/*** 是一个很好的验证200页,但人们可能会不小心输入 /GB/en/cat/Product/abc/cde/***/GB/en/cat/PRODUCT/abc/cde/*** (因为我的内容页是区分大小写的)这两个url造成了我的seo目的的问题,所以我需要在dispatcher中设置重写规则来处理任何类似的事情。 /GB/en/cat/Product/abc/cde/***/GB/en/cat/PRODUCT/abc/cde/*** ,将它们转移到 /GB/en/cat/product/abc/cde/***

下面是我目前的尝试,但只有当用户输入了 /gb/en/cat/Product/.../gb/en/cat/PRODUCT/... 那么它就可以成功地改成 /GB/en/cat/PRODUCT/abc/cde/***

RewriteCond %{ENV:PAGE_REQUEST} ^true$
  RewriteCond %{REQUEST_URI} !^/[A-Z]{2}/[a-z]{2}
  RewriteRule ^/([a-zA-Z]{2})/([a-zA-Z]{2})(.*) "/${toupper:$1}/${tolower:$2}/${tolower:$3}" [R=301,L]

如果用户输入 /GB/en/cat/PRODUCT/... 重写规则无法工作......任何代码建议将是真正的apprecaited.Thanks。

regex adobe aem dispatcher sightly
1个回答
1
投票

就像Vlad说的:你的第二个条件会限制规则,只有两个条件都满足,才会应用规则。你的第二个条件说,只有当URI不是以两个大写字符开始,后面跟着两个小写字符时,才会应用该规则。因此,您的第二个条件说,只有当URI不是以两个大写字符开始,后面是两个小写字符时,才会应用该规则。/GB/en/cat/PRODUCT/... 不会匹配,因为不满足第二个条件。这意味着该规则不适用,大写的 PRODUCT 是不固定的。你可以直接删除第二个条件,因为你的规则不会改变正确的大小写字符。

rakhi4110也已经说过,你的rewriterule中的第三组。(.*) 将会包括语言的两个字母后面的字母, 所以如果你在规则的结尾处写上 /${tolower:$3}要解决这个问题,你可以去掉最后的斜线,或者在第2组和第3组之间增加一个斜线。

RewriteRule ^/([a-zA-Z]{2})/([a-zA-Z]{2})/(.*) "/${toupper:$1}/${tolower:$2}/${tolower:$3}" [R=301,L]

或者

RewriteRule ^/([a-zA-Z]{2})/([a-zA-Z]{2})(.*) "/${toupper:$1}/${tolower:$2}${tolower:$3}" [R=301,L]

(IMO第一种是比较干净的代码)

所以总结一下,下面的内容应该是可行的。

RewriteCond %{ENV:PAGE_REQUEST} ^true$
RewriteRule ^/([a-zA-Z]{2})/([a-zA-Z]{2})/(.*) "/${toupper:$1}/${tolower:$2}/${tolower:$3}" [R=301,L]

1
投票

你的第二个重写条件限制了这个规则

RewriteCond %{REQUEST_URI} !^/[A-Z]{2}/[a-z]{2}
© www.soinside.com 2019 - 2024. All rights reserved.