首页 > 解决方案 > htaccess 正则表达式变量参数

问题描述

我不习惯正则表达式,我想我已经浪费了太多时间来尝试解决这个问题,所以我想我会寻求帮助。我正在尝试美化 html 扩展名。

我的网站将使用具有可变参数的 URL。例如:

所有人都将使用 .html 作为扩展名。

在 htaccess 文件中,我尝试过

RewriteRule ^(article\/[a-z].*)$ $1.html [NC,L]

以及对此的细微变化,但无法做到这一点。提前感谢您的任何帮助。

标签: regex.htaccess

解决方案


首先,让我们看看您拥有的正则表达式:

^(文章/[az].*)$

这与字符串“article/”完全匹配,后跟至少一个字母(由于标志不区分大小写NC),后跟零个或多个任何内容。它非常广泛,但应该与您提供的示例相匹配。

测试它是否匹配的一种方法是将R=temp标志添加到规则中,它告诉 Apache将浏览器重定向到新的 URL(我建议使用“=temp”来停止浏览器缓存重定向并使以后的测试更加困难)。然后,您可以观察(例如在浏览器的 F12 调试控制台中)原始请求和重定向的请求。

RewriteRule ^(article/[az].*)$ $1.html [NC,L,R=temp]

但是,正如 CBroe 指出的那样,您的规则将在目标 URL 上再次匹配,因此您需要防止这种情况发生。一种简单的方法是使用标志END不是L

使用 [END] 标志不仅会终止当前轮次的重写处理(如 [L]),而且还可以防止任何后续的重写处理在每个目录(htaccess)上下文中发生。

所以:

RewriteRule ^(article/[az].*)$ $1.html [NC,END]

或者,您可以使您的模式更严格,例如将.("anything") 更改为[^.]("anything other than a dot"):

^(文章/[az][^.]*)$

更具体地说,您可以添加RewriteCond带有额外模式的 a 以应用规则,例如“任何结尾.html”。


推荐阅读