在RewriteRule引起头痛

时间:2010-03-08 16:48:13

标签: regex apache .htaccess url-rewriting

我正在努力解决我的.htaccess文件中一个非常基本的正则表达式问题,我希望有人能够对此有所了解。基本前提是我想教Apache将任何.html扩展名转换为.var扩展名。我原以为这条规则是微不足道的:

RewriteRule ^([^.]+)\.html$ $1.var

但是[^。]部分根本不起作用。奇怪的是,它的工作方式如此

RewriteRule ^([^A-Z]+)\.html$ $1.var

我不明白为什么后一条规则有效。假设我正在寻找一个名为“index.html”的文件,那么$ 1应该匹配“index”。而“.html”位实际上应该无法匹配。

为了稍微扩大问题的范围,我实际上是在如何实施多语言网站。我不喜欢Apache的MultiView选项,因为它强加给我一个平面目录结构,其文件扩展名是许多开发工具无法识别的。我可以去.var类型映射路由,但我发现Apache的默认配置也不支持这一切(因此我到正则表达式的土地)。因此,当我使用mod_rewrite时,我想我可能会全力以赴:每当收到name.html文件的请求并且该文件不存在时,请检查是否存在XX / name.html文件,其中“XX”是根据用户偏好的语言代码。

这会给我一个更简洁的目录结构,虽然在我的网站不支持用户浏览器的语言偏好的情况下,它可能不会像.var方法一样好(在哪种情况下.var会替代EN或类似的)。

有什么想法?感谢。

2 个答案:

答案 0 :(得分:0)

为什么不使用^(.*)\.html$?这将匹配以.html结尾的任何字符串。毕竟,文件名可以包含多个点。

如果正则表达式区分大小写,则

[^A-Z]+匹配index。也许这就是原因?但是,[^.]+失败的原因超出了我的范围。

答案 1 :(得分:0)

.匹配除换行符之外的所有内容。
在字符类中,^表示“不”。
+表示前面一个或多个字符类。

所以当你写([^.]+)时,会说“匹配一个或多个换行符”。因此,除非你有一个由换行符后跟“.html”组成的URL,否则这将不起作用。

^([^A-Z]+)\.html$有效,因为它匹配一个或多个不是大写字母的字符。如果你的URL中的“.html”之前有任何大写字母,那么这个字母也会失败。

Tim Pietzcker的建议是正确的:只需使用^(.*)\.html$,请记住,在您的网址中有换行符的奇怪情况下,这不起作用。

在奇怪的情况下,你实际上有URL的换行符,你可以使用^([\d\D]+)\.html$,它将匹配数字和非数字(即所有内容)直到“.html”。