【问题标题】:Apache Rewrite Rule (Regex)Apache 重写规则(正则表达式)
【发布时间】:2010-07-17 11:52:52
【问题描述】:

我正在使用 apache,我需要重写 URL 类型:

/a/b/c/d/boundary/stuff*

到:

/boundary/a_b_c_d/stuff*

我需要将第一个 Uri 重写为第二种格式。

'/boundary' 之前的元素数量是可变的,我想用 '_' 替换元素之间的所有斜线('/')

边界词总是一样的。

我认为我需要制定两条规则,一条用于斜线替换,另一条用于将边界更改为 URL 的开头:

我认为第二条规则类似于 ^/(.*?)/\bboundary\b/boundary/$1

有没有可能实现我想要的?!

怎么样?!

谢谢。

编辑

我想匹配到第一个边界词, 可以有一个像

这样的 URL

/a/b/c/d/边界/边界

编辑

秋葵谢谢你的帮助

根据您的重写规则,我设法创建了一个。

【问题讨论】:

  • 边界之前的元素数量是无限的还是最多 n 级深。如果你知道只有 n 个级别,那么编写 n 个正则表达式可能会简单得多。

标签: regex apache mod-rewrite


【解决方案1】:

试试这些规则:

RewriteRule ^/([^/]+)/(.+)/boundary/([^/]+)$ /$1_$2/boundary/$3 [N]
RewriteRule ^/([^/]+)/boundary/([^/]+)$ /boundary/$1/$2 [L]

注意带有 N 标志的第一条规则会导致内部重写而不增加内部计数器。所以很有可能你有无限递归。


编辑    更改问题后:

RewriteCond $1 !=boundary
RewriteCond $2 !=boundary
RewriteRule ^/([^/]+)/([^/]+)(/.*)?$ /$1_$2$3 [N]
RewriteRule ^/([^/]+)/boundary(/.*)$ /boundary/$1$2 [L]

【讨论】:

  • 旁注:如果它们在每个目录 (.htaccess) 上下文中,RewriteRule 测试模式应该丢失初始正斜杠。使用问题中的示例,它在我的测试服务器上完美运行,+1
  • @Tim:感谢您的测试。
猜你喜欢
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多