【问题标题】:URL rewrite using PCRE expression - append prefix to all incoming URIs except one pattern使用 PCRE 表达式重写 URL - 将前缀附加到所有传入的 URI,除了一种模式
【发布时间】:2016-10-12 19:03:34
【问题描述】:

我使用匹配表达式为https://([^/]*)/(.*),并将表达式替换为constantprefix/$2,并尝试通过将“/constantprefix”添加到所有网址来重写传入的网址

对于以下 URL,它按预期工作:

  1. https://hostname/incomingURI 正在转换为 /constantprefix/incomingURI
  2. https://hostname/ 正在转换为 /constantprefix/
  3. https://hostname/login/index.aspx 正在转换为 /constantprefix/login/index.aspx

我对已经以 /constantprefix 开头的 URL 有问题,我在输出 URL 中看到两个 /constantprefix/constantprefix 我不寻找,有什么办法可以避免这种情况吗?

如果传入 URL 为 https://hostname/constantprefix/login/index.aspx,则输出 URL 将变为 https://hostname/constantprefix/constantprefix/login/index.aspx 我可以知道如何从匹配表达式中避免 /constantprefix/constantprefix 吗?

【问题讨论】:

  • 也许只是添加一个测试,比如unless $url =~ |https://([^/]*)/$prefix|(未经测试)。然后它使用字符串两次,但它是直接扫描,效率应该不会太差
  • 感谢您的快速回复,您是否建议匹配表达式为 https://([^/]*)/(.*)|https://([^/]*)/ $constantprefix ?
  • 抱歉——我的意思是你做了替换除非它已经匹配了那个位置的$prefix。因此,要检查它是否存在,如果不存在则运行替换。它比弄乱工作正则表达式要简单得多,而且很清楚它的作用。它确实会查看字符串两次,但检查应该很快。
  • 我正在使用 IBM DataPower URL-write 功能,它没有提供任何条件的选项...我只能传递匹配表达式和替换表达式.. 我想看看是否有无论如何,我们可以跳过特定的 URL 模式,例如 /constantprefix/*
  • 试试https://[^/]*/(?!constantprefix(?:/|$))(.*)constantprefix/$1

标签: regex pcre regex-greedy urlrewriter


【解决方案1】:

你可以这样做:

https://[^/]*/(?!constantprefix(?:/|$))(.*)

使用替换字符串:

constantprefix/$1

(?!...) 是一个否定的前瞻,意味着后面没有。这只是一个测试,不消耗字符(模式中的这种元素也称为“零宽度断言”作为后视或锚点^$)。 p>

您的模式中的第一个捕获组无用,我将其删除。

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多