假设我有一个产品页面 /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。
就像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]
你的第二个重写条件限制了这个规则
RewriteCond %{REQUEST_URI} !^/[A-Z]{2}/[a-z]{2}