【问题标题】:mod_rewrite: can a back reference be referenced twice?mod_rewrite:后向引用可以被引用两次吗?
【发布时间】:2012-12-23 03:11:20
【问题描述】:

我有一个重写规则(在 Apache htaccess 文件中),它试图从一次捕获 ($1) 中使用两次反向引用:

RewriteRule ^([A-Za-z0-9_-]+)/?$ $1.php?nav=$1

查询字符串似乎是空的,比如

example.com/new

被改写为

example.com/new.php?nav=

我想要的是

example.com/new.php?nav=new

我的问题:我可以在表达式中引用两次 $1 吗?

更新:

mod_rewrite 上的 Apache documentation 表明您可以在重写规则的替换部分中多次引用捕获。但是,在尝试了几天后,我无法使其工作。我确实让我的规则通过了在线正则表达式测试器,但不在我的网站上。最后我重新设计了我的菜单系统,以便我可以使用更简单的重写规则。

【问题讨论】:

  • 这很有趣。我不明白为什么你不会能够,因为在正则表达式的所有其他实现中,这是可能的。我很好奇,如果您使用 ^((A-Za-z0-9-_))$ 代替,然后使用 $1$2,会发生什么?如果这行得通,那将更强烈地将问题与您的建议隔离开来。
  • 谢谢。尝试了 2 美元,但问题仍然存在。
  • 其实这是一个有用的提示!这不起作用的事实暗示这 没有 与两次使用反向引用有很大关系。其他事情正在发生。
  • 我的所有其他规则都可以正常工作。这是我试图“重用”反向引用的唯一一个,这似乎完全合乎逻辑。这是我唯一能看到的与其他规则不同的地方。
  • 这可能是唯一一个重复使用反向引用的,但这可能只是一个巧合。您说的另一个示例不起作用,表明它不是 only 重复反向引用的情况失败:使用 separate 反向引用也失败了。尝试$1$1.php?nav=$1 替换字符串,看看我的意思。我相信在那个例子中,您看到重复的反向引用工作,只是不在查询字符串中,而且我进一步相信您的 query 字符串存在问题,而不是与反向引用有关。

标签: regex apache mod-rewrite


【解决方案1】:

您使用的这个正则表达式是错误的:

^(A-Za-z0-9-_)$

范围只允许在方括号中,您需要使用+ 访问器来匹配多个字符。

用这个替换你的 RewriteRule:

RewriteRule ^([a-z0-9_-]+)/?$ $1.php?nav=$1 [L,NC,QSA]

【讨论】:

  • 谢谢。你是对的,但同样的问题仍然存在。查询字符串仍然丢失。
  • 我已经测试过这条规则,它运行良好。很可能您有一些其他规则或脚本正在剥离您的查询字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
相关资源
最近更新 更多