在 mod_rewrite 规则中转换为小写

Posted

技术标签:

【中文标题】在 mod_rewrite 规则中转换为小写【英文标题】:Convert to lowercase in a mod_rewrite rule 【发布时间】:2011-02-24 19:17:44 【问题描述】:

我希望像 server.com/foo 这样的 URL 不区分大小写。 但 server.com/foo 实际上得到了 mod_rewrite'd 到 server.com/somedir/foo

(假设“somedir”中的所有文件都是小写的。)

所以问题是,如何完成如下的 mod_rewrite:

RewriteRule  ^([^/]+)/?$  somedir/convert_to_lowercase($1)

PS:这是一个方便的 mod_rewrite 备忘单——http://dreev.es/modrewrite——虽然它无法回答这个特定的问题。

PPS:感谢 Bee 和 Ignacio 对于这方面的所有帮助。 另外,这是一个相关的问题: RewriteMap activation

【问题讨论】:

【参考方案1】:

首先,将以下行放入 .conf 文件的 <VirtualHost> 部分。 (对于住在/etc/httpd/vhosts.d/00foo.conf的我来说。)

RewriteMap lc int:tolower 

您可以将lc 替换为您想要的任何名称。 然后重启apache,用sudo service httpd restart就可以了。

最后,将其添加到您的 .htaccess 文件中:

RewriteRule ^/(.*)$ /$lc:$1 

【讨论】:

在这里工作。你反弹httpd了吗? 可能不会。这是什么意思? 感谢您的帮助,伊格纳西奥。我更新了这个答案,明确说明在哪里放置什么以及重新启动 apache。 请注意:这可能不像宣传的那样有效。第一部分是正确的。将 RewriteMap 语句放在 .conf 文件中。但是在 .htaccess 文件中,您可能需要多一条语句; “RewriteEngine On”这就是最终对我有用的方法。 RewriteEngine On RewriteCond %REQUEST_URI [A-Z] RewriteRule . $lc:%REQUEST_URI [R=301,L] "在你的 .htaccess 文件中添加这个:" - 虽然发布的指令只能在 servervirtualhost 上下文中工作。跨度> 【参考方案2】:
RewriteMap tolower int:tolower
RewriteRule  ^([^/]+)/?$  somedir/$tolower:$1

【讨论】:

啊,谢谢,它现在与我同时在网络上其他地方找到的匹配,但它仍然不适合我。我不明白你关于弹跳 httpd 的其他评论。 我尝试将以上内容添加到我的 .htaccess 并重新启动 httpd,但它正在使整个域崩溃。错误日志显示:“此处不允许重写映射”。我应该把 Rewritemap 语句具体放在哪里?我找到的文档将其显示为两个连续的行,如上所示。 (我只是将它放在特定 RewriteRule 上方的 .htaccess 中)。 @Bee:文档说“服务器配置,虚拟主机”,这意味着在主配置流或<VirtualHost> 指令中。 httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap 对不起,我们对这些东西太关注了。我从您提供的链接中看到(谢谢!).htaccess 中不允许使用 RewriteMap 行。我尝试放入 /etc/httpd/vhosts.d/00server.conf 的 部分,但是当我重新启动 Apache 时,它​​抱怨这里不允许使用 RewriteMap。 这真的很奇怪。我在<virtualHost> 部分工作得很好,所以我不知道发生了什么。【参考方案3】:

出于 SEO 的目的,我会将其设为 301 重定向,而不是 URL 重写:

RewriteMap tolower int:tolower
RewriteRule  ^([^/]+)/?$  somedir/$tolower:$1 [R=301,L]

【讨论】:

没有缓存过期标头的 301 是非常糟糕的做法,因为它会在浏览器中永久缓存。你会在它的影响下生活多年。将R=301,L 更改为R=301,L,E=limitcache:1 并添加Header always set Cache-Control "max-age=3600" env=limitcache 指令。这会将缓存限制为 1 小时,同时仍为您提供 301 重定向的 SEO 优势。 301 重定向根据定义是永久,因此默认情况下可以无限期缓存。如果您希望重定向不是永久性的,请使用302

以上是关于在 mod_rewrite 规则中转换为小写的主要内容,如果未能解决你的问题,请参考以下文章

在 mod_rewrite 规则正则表达式中匹配问号

apache mod_rewrite:如何根据其他目录中的文件存在为同一目录添加不同的重写规则?

Apache URL重写规则

mod_rewrite:重写规则还是重定向?

如何调试 mod_rewrite 规则?

将 .htaccess 转换为 nginx (mod_rewrite)