我正在尝试组合一个正则表达式,将包含大写字符的URL重写为相同的URL,但都是小写。
示例:example.com/foO-BAR-bAz
重写为example.com/foo-bar-baz
example.com/FOO-BAR-BAZ
重写为example.com/foo-bar-baz
example.com/foo-bar-baz
* 不匹配 *
我尝试使用^\/(?=.*[A-Z])
来匹配一个至少包含一个大写字符的字符串,但它并不匹配整个字符串。我还知道我需要使用一个“捕获组”,但我不确定如何使用。
我将在Apache服务器的.htaccess文件中实现此重定向规则
1条答案
按热度按时间g0czyy6m1#
如果您使用的是Apache 2.4,那么在
.htaccess
中,您可以将mod_rewrite与 Apache expression 一起使用,并使用tolower()
函数。(这不需要在服务器配置中使用RewriteMap
,如注解中所述。)例如:RewriteRule
pattern 只检查请求的URL路径中是否至少有一个大写字母。(REQUEST_URI
服务器变量),然后使用regex有效地 * 捕获 * 该变量。* 替换字符串 * 中的%1
反向引用保存tolower()
函数调用的结果,即内部重写为的小写URL路径。要“更正”URL并发出 external redirect,只需将
R
标志添加到RewriteRule
指令即可。例如:**更新:**要在将HTTP重定向到HTTPS(和/或非www与www)时消除双重重定向,请将完整的规范URL作为此规则的一部分,然后实现规范(方案+主机名)重定向。
例如:
请注意,
%1
反向引用已经在URL路径的开头包含斜杠前缀,因此在 substitution 字符串中省略了该前缀。但是,在这种情况下,进行双重重定向并不一定是错误的。例如,首先将HTTP重定向到HTTPS(相同的主机名和URL路径),然后规范化所请求URL的其他元素(主机名,大写/小写URL路径等)。这些应该是边缘情况,因此实际影响最小。
请注意,如果您正在实作HSTS,则必须先在相同的主机名称 * 上从HTTP重新导向至HTTPS *,然后再规范主机名称(例如www vs non-www)。在此情况下,您应该使用
HTTP_HOST
服务器变数(例如%{HTTP_HOST}
)作为上述重新导向的主机名称。在此情况下无法避免双重重新导向。