如何在 .htaccess 中将 URL 从大写重写为小写

yev*_*evg 1 regex apache .htaccess mod-rewrite url-rewriting

我正在尝试编写一个正则表达式,将包含大写字符的 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 文件中实现此重定向规则

MrW*_*ite 6

如果您使用的是 Apache 2.4,那么.htaccess您可以将 mod_rewrite 与Apache 表达式一起使用并使用该tolower()函数。(这不需要RewriteMap在服务器配置中使用 a,如评论中所述。)例如:

RewriteEngine On

RewriteCond expr "tolower(%{REQUEST_URI}) =~ /(.*)/"
RewriteRule [A-Z] %1 [L]
Run Code Online (Sandbox Code Playgroud)

RewriteRule 模式只是检查所请求的 URL 路径中至少有一个大写字母。然后该RewriteCond指令调用tolower()URL 路径(服务器变量)上的函数,然后使用正则表达式REQUEST_URI有效捕获该函数。然后,替换字符串%1中的反向引用保存函数调用的结果,即。小写的 URL 路径,在内部重写。tolower()

要“更正” URL 并发出外部重定向,只需将R标志添加到指令中即可RewriteRule。例如:

:
RewriteRule [A-Z] %1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

更新:要消除将 HTTP 重定向到 HTTPS(和/或非 www 与 www)时的双重重定向,请包含完整的规范 URL 作为此规则的一部分,并其次实施规范(方案 + 主机名)重定向。

例如:

# 1 - Upper to lowercase conversion (and HTTPS and WWW)
RewriteCond expr "tolower(%{REQUEST_URI}) =~ /(.*)/"
RewriteRule [A-Z] https://www.example.com%1 [R=301,L]

# 2 - HTTP to HTTPS
:
Run Code Online (Sandbox Code Playgroud)

请注意,%1反向引用已在 URL 路径开头包含斜杠前缀,因此在替换字符串中省略了该前缀。

然而,在这种情况下使用双重重定向并不一定是错误的。IE。首先将 HTTP 重定向到 HTTPS(相同的主机名和 URL 路径),然后规范化所请求 URL 的其他元素(主机名、大写/小写 URL 路径等)。这些首先应该是边缘情况,因此对现实世界的影响很小。

请注意,如果您正在实施HSTS,则要求您首先在同一主机名上从 HTTP 重定向到 HTTPS ,然后再规范化主机名(即 www 与非 www)。在这种情况下,您应该使用HTTP_HOST服务器变量(即%{HTTP_HOST})作为上述重定向中的主机名。在这种情况下无法避免双重重定向。