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

tcomlyy6  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(111)

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

g0czyy6m

g0czyy6m1#

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

RewriteEngine On

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

RewriteRulepattern 只检查请求的URL路径中是否至少有一个大写字母。(REQUEST_URI服务器变量),然后使用regex有效地 * 捕获 * 该变量。* 替换字符串 * 中的%1反向引用保存tolower()函数调用的结果,即内部重写为的小写URL路径。
要“更正”URL并发出 external redirect,只需将R标志添加到RewriteRule指令即可。例如:

:
RewriteRule [A-Z] %1 [R=301,L]

**更新:**要在将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
:

请注意,%1反向引用已经在URL路径的开头包含斜杠前缀,因此在 substitution 字符串中省略了该前缀。
但是,在这种情况下,进行双重重定向并不一定是错误的。例如,首先将HTTP重定向到HTTPS(相同的主机名和URL路径),然后规范化所请求URL的其他元素(主机名,大写/小写URL路径等)。这些应该是边缘情况,因此实际影响最小。
请注意,如果您正在实作HSTS,则必须先在相同的主机名称 * 上从HTTP重新导向至HTTPS *,然后再规范主机名称(例如www vs non-www)。在此情况下,您应该使用HTTP_HOST服务器变数(例如%{HTTP_HOST})作为上述重新导向的主机名称。在此情况下无法避免双重重新导向。

相关问题