regex - htaccess 正则表达式变量参数
问题描述
我不习惯正则表达式,我想我已经浪费了太多时间来尝试解决这个问题,所以我想我会寻求帮助。我正在尝试美化 html 扩展名。
我的网站将使用具有可变参数的 URL。例如:
- mysite.com/article/this-is-an-entry
- mysite.com/article/this-is-an-完全不同的条目
所有人都将使用 .html 作为扩展名。
在 htaccess 文件中,我尝试过
RewriteRule ^(article\/[a-z].*)$ $1.html [NC,L]
以及对此的细微变化,但无法做到这一点。提前感谢您的任何帮助。
解决方案
首先,让我们看看您拥有的正则表达式:
^(文章/[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
”。
推荐阅读
- javascript - 如何更改汉堡图标的颜色?
- javascript - 我在哪里将我的 ajax 添加到 Bootstrap 4 的表单验证 javascript?
- django - 如何允许用户编辑他们的个人资料?
- python - 循环遍历当前行时如何处理下一行?
- node.js - http-server 不工作并且不显示文件
- unity3d - 当我从另一个脚本调用统一 StartCorountine 时,它没有唤醒
- android - 如何创建支持不同屏幕尺寸的布局?
- python - 如何在python中按段落拆分?
- android - 如何使用终端(shell)获取有关 .apk 文件的信息?
- c# - 并非所有代码路径都返回值 // 返回 void