我正在努力解决我的.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或类似的)。
有什么想法?感谢。
答案 0 :(得分:0)
为什么不使用^(.*)\.html$
?这将匹配以.html
结尾的任何字符串。毕竟,文件名可以包含多个点。
[^A-Z]+
匹配index
。也许这就是原因?但是,[^.]+
失败的原因超出了我的范围。
答案 1 :(得分:0)
.
匹配除换行符之外的所有内容。
在字符类中,^
表示“不”。
+
表示前面一个或多个字符类。
所以当你写([^.]+)
时,会说“匹配一个或多个换行符”。因此,除非你有一个由换行符后跟“.html”组成的URL,否则这将不起作用。
^([^A-Z]+)\.html$
有效,因为它匹配一个或多个不是大写字母的字符。如果你的URL中的“.html”之前有任何大写字母,那么这个字母也会失败。
^(.*)\.html$
,请记住,在您的网址中有换行符的奇怪情况下,这不起作用。 在奇怪的情况下,你实际上有URL的换行符,你可以使用^([\d\D]+)\.html$
,它将匹配数字和非数字(即所有内容)直到“.html”。