2010-03-08 36 views
0

我在我的.htaccess文件中遇到了一个非常基本的正则表达式问题,我希望有人能够说明一些问题。基本前提是我想教Apache将任何.html扩展名切换为.var扩展名。我曾经认为这个规则会显得微不足道:在RewriteRule中造成头痛

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

但是[^。]部分根本不起作用。奇怪的是,它的工作原理是这样的

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

我不明白为什么后者的规则有效。假设我正在寻找名为“index.html”的文件,那么$ 1应该匹配到“索引”。和“.html”位应该实际上不匹配。

为了扩大这个问题的范围,我实际上正在绞尽脑汁想如何实现一个多语言网站。我不喜欢Apache的MultiView选项,因为它强制我的平面目录结构具有许多开发工具无法识别的文件扩展名。我可以去.var类型地图路线,但我发现Apache的默认配置不支持这一切都好(因此我的游览到正则表达式土地)。所以,当我使用mod_rewrite时,我想我可能会走完整个猪圈:每当收到一个name.html文件的请求并且该文件不存在时,检查是否存在XX/name.html文件,而不是“XX”是根据用户喜好的语言代码。

这会给我一个整洁的目录结构,虽然它可能不会像.var方法那样执行,在用户浏览器的语言首选项不被我的站点支持的情况下(在这种情况下.var会取代EN或类似的)。

有什么想法?谢谢。

回答

0

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

[^A-Z]+匹配index如果应用正则表达式区分大小写。也许这是原因?不过,为什么[^.]+应该会失败。

+0

好吧,我发现我一直是一个白痴。你的回答非常正确。唉,我没有考虑我的(无条件的)RuleRewrite的影响:一旦我将index.html变形为index.var,Apache的类型映射就跳入了操作中,并查看index.var文件中的资源进行映射。它将DE/index.html拉出帽子。然后,Apache将DE/index.html接受另一个重写过程,最终将该名称改为DE/index.var。而那个文件则不存在。不计算精彩:-))) – Ollie2893 2010-03-09 10:18:50

+0

糟糕:)好的侦探工作。 – 2010-03-09 10:41:54

0

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

所以,当你写([^.]+),这表示“匹配一个或多个换行符”。所以除非你有一个由换行符后跟“.html”组成的网址,否则这是行不通的。

^([^A-Z]+)\.html$因为它匹配一个或多个字符而不是大写字母。如果您的网址中的“.html”之前有任何大写字母,则此问题也会失败。

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

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

+0

好的...有趣。有两件事让我困惑: (1)我从正则表达式的理解是,每个表达式试图吞噬最长的匹配。那么表达式^(。*)\。html $ function?在我看来,*应该吞下“.html”。然后为了匹配.html,它将不得不重新回到步骤? (2)你确定“。”在角色类[]内保留你赋予的意思(我同意,它在外面有这样的类)?如果是这样,我也尝试[^ \。] +没有更多的喜悦。当然,\本应该逃避正常的意义? – Ollie2893 2010-03-08 23:27:38

+0

PS:顺便说一句,“^(。*)\。html $ $ 1.var”也失败。在您认为我正在查看根本性失败之前,“^(index)\。html $ $ 1.var”有效(对于target index.html)。 – Ollie2893 2010-03-08 23:37:37