调度程序正则表达式匹配大小写然后将 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]
假设我有一个产品页面 /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]