转换为在的mod_rewrite规则

问题描述:

小写我想喜欢server.com/foo网址是区分大小写。 但server.com/foo实际上得到mod_rewrite'd到server.com/somedir/foo转换为在的mod_rewrite规则

(假定在“somedir”所有的文件都是小写)

所以现在的问题是,如何完成一个mod_rewrite的类似如下:

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

PS:这里有一个方便的mod_rewrite作弊表 - http://dreev.es/modrewrite - 尽管它不能回答这个特定问题。

PPS:由于 BeeIgnacio 所有与此有关的帮助。 此外,这里有一个相关的问题: RewriteMap activation

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

RewriteMap lc int:tolower 

你可以用任何你想要的名称替换lc。 然后重新启动Apache,您可以使用sudo service httpd restart

最后,在你的.htaccess文件添加此:

RewriteRule ^/(.*)$ /${lc:$1} 
+0

适用于此。你反弹httpd? – 2010-05-27 19:15:14

+0

可能不是。那是什么意思? – dreeves 2010-05-27 19:19:04

+0

重新启动它。发送一个SIGHUP在POSIX上工作。 – 2010-05-27 19:34:20

RewriteMap tolower int:tolower 
RewriteRule ^([^/]+)/?$ somedir/${tolower:$1} 
+1

啊,谢谢,现在与我在网络上其他地方找到的相匹配,但它仍然不适合我。我不明白你关于反弹httpd的其他评论。 – dreeves 2010-05-27 19:25:56

+0

我尝试将以上添加到我的.htaccess并重新启动httpd,并且它将整个域名关闭。错误日志说:“这里不允许重写映射”。在哪里我应该把Rewritemap语句?我发现的文档显示它连续两行,如上所示。 (我只是坚持在特定的RewriteRule上方.htaccess)。 – Bee 2010-05-28 03:03:54

+1

@Bee:该文档说“服务器配置,虚拟主机”,这意味着在右主配置流或''指令中。 http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap – 2010-05-28 03:13:20

我想使它成为一个301重定向,而不是URL重写,搜索引擎优化的目的:

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

没有缓存过期头的301是非常糟糕的做法,因为它在浏览器中被永久缓存。你将会生活多年。将'R = 301,L'改为'R = 301,L,E = limitcache:1'并添加一个'Header always set Cache-Control“max-age = 3600”env = limitcache'指令。这将限制缓存1小时,同时仍然给你301重定向的SEO优势。 – 2015-12-16 09:58:25