2

Ich versuche, alle URIs übereinstimmen, die mit #/tool_[a-z\-]+#außer beginnen, wenn sie von /public gefolgt wird. Wie /tool_calculator oder was auch immer.Mod Rewrite Regex Negative Lookahead

Zum Beispiel, wenn der URI mit /tool_store-front oder /tool_store-front/anything-but-public beginnt, dann möchte ich sie zu HTTPS umleiten. Also, /tool_store-front/public würde nicht umleiten.

Hier ist, was ich habe, und es funktioniert nicht

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] 

Antwort

2

Sie können auch Ihre negative Vorschau Bedingung dies eine besitzergreifend quantifier mit ändern:

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] 

Sie können auch diese negative Vorschau verwenden :

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

Problem in Ihrem Zustand ^/?tool_[a-z-]+(?!/public.+) ist, dass Regex-Engine ist Backtracking [a-z]+, eine Position vor / zu negativen Lookahead (?!/public.+) wahren.

+0

Es hat funktioniert. Danke <3. Aber wie kommt es, dass es '[a-z] +' 'wie gesagt rückwärts verfolgt? Ich folgte nicht ganz: '( –

+1

[Siehe diese Demo, um besser zu verstehen] (https://regex101.com/r/Zipw5q/1) Überprüfen Sie 'regex debugger' link, um Backtracking Teil besser zu verstehen. Sobald das klar ist, ändern regex zu '^/tool_ [az -] ++ (?!/public)' und jetzt wird es keine Übereinstimmung mehr geben und 'regex debugger 'erneut prüfen – anubhava