我正在尝试在 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}"