Mod重写正则表达式负前瞻

Yes*_*rry 6 regex .htaccess mod-rewrite negative-lookahead regex-greedy

我正在尝试匹配所有以 开头的 URI,#/tool_[a-z\-]+# 除非后跟/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]
Run Code Online (Sandbox Code Playgroud)

anu*_*ava 6

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

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]
Run Code Online (Sandbox Code Playgroud)

您还可以使用此否定前瞻:

RewriteCond %{REQUEST_URI} ^/tool_[a-z-]+(?!.*/public) [NC,OR]
Run Code Online (Sandbox Code Playgroud)

您的情况的问题^/?tool_[a-z-]+(?!/public.+)是正则表达式引擎正在回溯[a-z]+,前一个位置/断言负前瞻为(?!/public.+)真。