【问题标题】:htaccess regex variable parameterhtaccess 正则表达式变量参数
【发布时间】:2021-11-17 15:54:42
【问题描述】:

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

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

  • mysite.com/article/this-is-an-entry
  • mysite.com/article/this-is-an-entirely-different-entry

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

在htaccess文件中,我试过了

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

还有一些细微的变化,但无法做到这一点。提前感谢您的任何帮助。

【问题讨论】:

  • [a-z].* 会要求一个字母,然后允许任意数量的任意字符。因此,您的模式应该已经与这两种示例 URL 格式匹配。 “但无法做到这一点” - 会发生什么 - 你得到 404、500、...?
  • 您正试图简单地从article/this-is-an-entry 重写为article/this-is-an-entry.html,是吗?您的模式将再次匹配后一个 URL,因此 article/this-is-an-entry.html 将被重写为 article/this-is-an-entry.html.html 下一个。依此类推,依此类推 - 直到达到内部重定向限制。
  • "您正试图简单地从 article/this-is-an-entry 重写为 article/this-is-an-entry.html,是吗?"是的,这是对的。我收到 404 错误通知“找不到对象!”
  • 您要么需要找到一种方法来防止 article/this-is-an-entry.html 再次被重写(比如在您的模式中更具体,例如不允许任何点) - 或者您将其与 RewriteCond检查附加了.html 的请求是否与现有文件匹配,并且仅在这种情况下让重写继续进行。 (为此做一些细节研究,这是很常见的事情。)
  • @CBroe 好点,但仅供参考,最简单的解决方案是在标志中使用END 而不是L。请参阅下面的答案。

标签: regex .htaccess


【解决方案1】:

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

^(文章/[a-z].*)$

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

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

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

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

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

所以:

重写规则 ^(article/[a-z].*)$ $1.html [NC,END]

或者,您可以使您的模式更严格,例如将.(“任何东西”)更改为[^.](“除点之外的任何东西”):

^(文章/[a-z][^.]*)$

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

【讨论】:

  • 这成功了。感谢您花时间解释为什么这不起作用。我对 Apache 进程如何重写和应用它们有了更好的理解,这将在未来有所帮助。再次感谢!
猜你喜欢
  • 2012-07-29
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多