在 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 文件中添加这个:" - 虽然发布的指令只能在 server 或 virtualhost 上下文中工作。跨度>
【参考方案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 的 <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 规则中转换为小写的主要内容,如果未能解决你的问题,请参考以下文章