mboost-dp1
Apache - RewriteRule - regexproblem
- Forside
- ⟨
- Forum
- ⟨
- Programmering
RewriteRule !^(.+\.[a-zA-Z]+)$ index.php?page=$0 [QSA]
Virker perfekt bortset fra, at backreferences er slået fra, når man bruger NOT ('!') i Apache.
Det, den ovenstående regex gør (og den ønskede regex også skal), er, at sende ALLE sider (som ikke har en extension (fx '/hej.a') til index, hvor den så viser den rette side. Lige nu er $N jo tom.
Jeg ønsker nemlig ikke at opdatere .htacces hver gang, jeg opretter en ny side i wCMS'en (ja, jeg bruger faux directories), så jeg sender bare det hele af sted, så kan PHP klare resten (men filer (style.css, index.php, downloadfile.exe, etc.) skal ikke fanges).
Hvordan kan jeg omskrive den, så den opfylder mit ønske? Jeg har ledt efter en ordentlig not/negation character, men det nærmeste, der findes, er ^ til character classes/sets.
Hej, faggot. Her er svaret (for du har selvfølgelig fortalt, at du bruger Apache 2.2, som har PCRE5 og lookaround):
Det tog mig en evighed at finde, men http://regexpal.com/ er min ven! JEG HÅBER, DU ER TAKNEMMELIG!
^([A-Za-z0-9/]+(?!\.))$
Det tog mig en evighed at finde, men http://regexpal.com/ er min ven! JEG HÅBER, DU ER TAKNEMMELIG!
Det er egentlig åbenlyst hvorfor backreferences er slået fra når man negerer sit udtryk. Udtrykket matchede jo ikke, så hvilken del af strengen skal hver backreference så referere til?Daniel-Dane (1) skrev:RewriteRule !^(.+\.[a-zA-Z]+)$ index.php?page=$0 [QSA]
Virker perfekt bortset fra, at backreferences er slået fra, når man bruger NOT ('!') i Apache.
I stedet kan du omskrive din expression til en der matcher det modsatte. (Det kan altid lade sig gøre at omskrive den, men nogle gange bliver den meget mere compliceret af det).
Den her expression er ikke præcist det modsatte, men måske er den god nok til dit formål:
^.*[^A-Za-z0-9.][A-Za-z0-9]*$
#3
Nu har jeg fundet svaret (se #2). I #1 matchede jeg hele strengen ved at bruge ^$, så jeg ville bare have hele strengen tilbage.
Desuden virker din regex ikke på http://regexpal.com/.
Nu har jeg fundet svaret (se #2). I #1 matchede jeg hele strengen ved at bruge ^$, så jeg ville bare have hele strengen tilbage.
Desuden virker din regex ikke på http://regexpal.com/.
Gå til top
Opret dig som bruger i dag
Det er gratis, og du binder dig ikke til noget.
Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.