调度程序正则表达式匹配大小写然后将 url 的部分更改为小写

dispatcher regex match case then change parts of url to lower case

假设我有一个产品页面 /GB/en/cat/product/abc/cde/*** 是一个有效的 200 页,
但是人们可能会不小心输入 /GB/en/cat/Product/abc/cde/***/GB/en/cat/PRODUCT/abc/cde/***(因为我的内容页面区分大小写)这两个 url 导致我的 seo 目的出现问题 所以我需要在调度程序中重写规则来处理 /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:}/${tolower:}/${tolower:}" [R=301,L]

如果用户输入 /GB/en/cat/PRODUCT/...,重写规则将不起作用... 任何代码建议都会非常感激。 谢谢

您的第二个重写条件限制了规则:

RewriteCond %{REQUEST_URI} !^/[A-Z]{2}/[a-z]{2}

正如Vlad所说:你的第二个条件将限制规则,只有当两个条件都满足时,规则才会被应用。您的第二个条件表示仅当 URI 不是以两个大写字符开头,后跟两个小写字符时才应用规则。所以 /GB/en/cat/PRODUCT/... 不会匹配,因为不满足第二个条件。这意味着不应用规则并且大写 PRODUCT 不固定。您可以删除第二个条件,因为您的规则不会更改正确的大小写字符。

正如 rakhi4110 所说,您的重写规则中的第三组:(.*) 将在语言的两个字母之后包含 /,因此如果您以 /${tolower:} 结束规则,您将在 URI 中以两个斜杠结束,以修复您可以删除末尾的斜杠,或在第 2 组和第 3 组之间添加一个斜杠:

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

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

(IMO 第一个是更清晰的代码)

总而言之,以下应该有效:

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