【问题标题】:Apache rewrite of word to lowercaseApache将单词重写为小写
【发布时间】:2012-08-01 14:26:20
【问题描述】:

如果一个特定的单词中有一个大写字母,我需要将其重写为小写,但如果它完全是小写则不需要(如果它匹配会导致无限循环)。

我想出了这个,但对它为什么不起作用感到困惑:

# /MaTcHeD to matched
RewriteCond %{REQUEST_URI} ^(?i)matched(\/.*)?$
RewriteRule ^[a-z]*[A-Z]+[^\/]*(\/.*)?$ /matched$1 [R=301,L]

对我而言,这表示如果 url 是“匹配”或“匹配”或“mAtched”或“MAtched”等或多个大写字符 ([A-Z]) 后跟任何非“/”字符,然后是 url 的其余部分(可选的“/”后跟其他任何字符)。如果这些条件为真,则重定向到小写的“/matched”。

我浏览并看到了许多匹配任何单词的解决方案,但这会导致问题,因为其他东西都是大写的。在任何情况下我只需要“匹配”,但所有小写都需要重定向到所有小写“匹配”。

【问题讨论】:

  • 有什么理由不使用RewriteMap
  • 我研究过使用 RewriteMap,但它只会小写或大写所有没有帮助的东西。只要不是全部小写,我都需要匹配任何内容。
  • 那么匹配前面规则中的所有小写字母并禁止重写或跳过小写规则。

标签: regex apache mod-rewrite url-rewriting rewrite


【解决方案1】:

你可以做几个检查来解决这个问题,首先检查它根本不是小写:

RewriteCond %{REQUEST_URI} !^(.*)/matched(.*)$

然后检查如果使用[NC] 标志忽略大小写是否相同:

RewriteRule ^(.*)/matched(.*)$ /$1/matched$2 [R=301,L,NC]

此时,您知道不区分大小写,matched 匹配,但它不是全部小写,因此您可以重定向到全部小写。


我正在使用当前在 htaccess 级别的匹配,所以我不需要初始的“(.*)/”。使用它是行不通的。 “匹配”是域之后的第一个路径部分

然后试试这个:

RewriteCond %{REQUEST_URI} !^/matched(.*)$
RewriteRule ^matched(.*)$ /matched$1 [R=301,L,NC]

问题是%{REQUEST_URI} 变量确实 有一个前导斜杠,但用于匹配RewriteRule 的URI 没有 有一个(去图)。

【讨论】:

  • 嗯...我使用了 RewriteCond %{REQUEST_URI} !^matched(\/.*)?$ 和 RewriteRule ^matched(\/.*)?$ /matched$1 [R=301, L,NC],这会导致重定向循环。我正在使用当前在 htaccess 级别的匹配,所以我不需要初始的“(。*)/”。使用它是行不通的。 “匹配”是域之后的第一个路径部分。
  • Apache 中的重定向日志帮助不大。我将它设置为最大,它只说它匹配 "^matched(\/.*)?$" 但没有说其他任何内容。它甚至没有说明 RewriteCond 是匹配的。
  • @Jim 抱歉,我更新了答案,您需要在 RewriteCond 中添加前导 /
猜你喜欢
  • 1970-01-01
  • 2018-08-29
  • 2018-08-06
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 2019-12-02
相关资源
最近更新 更多