【问题标题】:How to rewrite URLs from UPPERCASE to lowercase in .htaccess如何在 .htaccess 中将 URL 从大写重写为小写
【发布时间】:2021-02-21 22:32:32
【问题描述】:

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

【问题讨论】:

  • 这(特别是替换部分)不应该在 .htaccess 中完成。对于使用内部tolower 函数的RewriteMap,这将是一个完美的用例,但这需要访问服务器配置/虚拟主机。如果这不是一个选项,那么我会将这些请求重写为一个很小的脚本(PHP 或任何可用的脚本),它包含小写字母的一部分,并发出外部重定向。
  • 还有一个一般性的提示:与其问如何做到这一点,您是否考虑过实际阅读一些有关正则表达式的知识?我的意思是它们 1. 有很好的文档和 2. 程序员应该知道的基本知识之一......
  • @CBroe 在 Apache 2.4 上,您可以使用 .htaccess 中的 tolower() 函数和 RewriteCond 指令中的 Apache 表达式。 (见下面的my answer。)

标签: regex .htaccess url-rewriting


【解决方案1】:

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

RewriteEngine On

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

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

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

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

【讨论】:

  • @anubhava 谢谢。虽然我想知道是否有一种“更好”的方法可以将函数的结果转换为 substitution 字符串?将结果与捕获的正则表达式进行比较并在替换中使用生成的反向引用,虽然非常灵活,但当您只需要整个结果时感觉有点“hacky”?
  • @yevg 你是怎么做到的?
猜你喜欢
  • 1970-01-01
  • 2012-11-19
  • 2016-05-23
  • 2017-05-28
  • 2013-07-18
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 2021-12-28
相关资源
最近更新 更多