Mod Rewrite Regex Negative Lookahead

时间:2017-03-31 20:51:37

标签: regex .htaccess mod-rewrite regex-greedy negative-lookahead

我正在尝试匹配以#/tool_[a-z\-]+# 开头的所有URI,除非,如果它后跟/public。例如/tool_calculator或其他。

例如,如果URI以/tool_store-front/tool_store-front/anything-but-public开头,那么我想将它们重定向到HTTPS。因此,/tool_store-front/public 重定向。

这是我拥有的,而且它不起作用

RewriteCond %{HTTPS} =off
RewriteCond %{REQUEST_URI} ^/?tool_[a-z-]+(?!/public.+) [OR]
RewriteCond %{REQUEST_URI} ^/?secure
RewriteCond %{REQUEST_URI} !^/?secure/public/info
RewriteRule ^(.*)$ https://www.example.org%{REQUEST_URI} [NC,L]

1 个答案:

答案 0 :(得分:2)

您还可以使用占有量词将负前瞻条件更改为:

RewriteCond %{HTTPS} =off
RewriteCond %{REQUEST_URI} ^/tool_[a-z-]++(?!/public) [NC,OR]
RewriteCond %{REQUEST_URI} ^/secure(?!/public/info) [NC]
RewriteRule ^ https://www.example.org%{REQUEST_URI} [NE,R=301,L]

你也可以使用这种否定的前瞻:

RewriteCond %{REQUEST_URI} ^/tool_[a-z-]+(?!.*/public) [NC,OR]
条件^/?tool_[a-z-]+(?!/public.+)中的

问题是正则表达式引擎回溯[a-z]+/之前的一个位置断言否定前瞻(?!/public.+)为真。