使用 RewriteRule 匹配 RewriteMap 值并忽略任何尾随斜杠和字符?

使用 RewriteRule 匹配 RewriteMap 值并忽略任何尾随斜杠和字符?

我正在尝试在 apache 2.4 virtualhost .conf 文件中使用 RewriteMap 来重定向多个 URL。各种请求可以引用映射中的单个条目,并且我在匹配 RewriteRule 中的这些变体时遇到问题,尤其是尾部斜杠。我目前有类似以下内容:

RewriteRule "^/foo/(this|that|anotherthing)/bar/(.*)" "/${map:$2}"

这很好用

/for/that/bar/request
/for/this/bar/request

相同的替换,但是当路径末尾有斜杠 + 任何其他字符时,我也需要提供相同的替换,即

/foo/this/bar/request/
/foo/this/bar/request/and/some/change

应该都根据“请求”的匹配返回相同的值。我似乎无法确定正确的正则表达式来匹配 0 或 1 / 以及字符串末尾的任何其他字符。这让我认为我误解了重写的一个重要部分。我需要使用 RewriteCond 吗?我希望使用类似

RewriteRule "^/foo/(this|that|anotherthing)/bar/(.*)(\/.*?|)" "/${map:$2}"

会起作用但迄今为止还没有运气。

答案1

您已经完成了大部分工作。尝试以下操作:

RewriteRule "^/foo/(this|that|anotherthing)/bar/(.+)(\/.+)?" "/${map:$2}"

我删除了第二个捕获组中的竖线,并将问号移到了外面。这使得整个捕获组成为可选的,并且如果存在,则必须以正斜杠开头。

我还改变了.*实例,.+因为您可能希望匹配至少 1 个字符。

编辑:

如果要使尾部斜杠也可选,只需将其添加\/?到末尾即可。如果第二个捕获组为空,则不会对此尾部斜杠进行检查。

RewriteRule "^/foo/(this|that|anotherthing)/bar/(.+)(\/.+)?\/?" "/${map:$2}"

相关内容