mboost-dp1

Apache - RewriteRule - regexproblem


Gå til bund
Gravatar #1 - Daniel-Dane
6. aug. 2010 20:10
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.
Gravatar #2 - Daniel-Dane
7. aug. 2010 18:39
Hej, faggot. Her er svaret (for du har selvfølgelig fortalt, at du bruger Apache 2.2, som har PCRE5 og lookaround):
^([A-Za-z0-9/]+(?!\.))$


Det tog mig en evighed at finde, men http://regexpal.com/ er min ven! JEG HÅBER, DU ER TAKNEMMELIG!
Gravatar #3 - kasperd
8. aug. 2010 08:54
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.
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?

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]*$
Gravatar #4 - Daniel-Dane
8. aug. 2010 09:17
#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/.
Gravatar #5 - kasperd
8. aug. 2010 15:43
Der skulle selvfølgelig have stået:
^\(.*[^A-Za-z.]\)\?[A-Za-z]*$

Jeg aner ikke hvordan den webside skal anvendes, mend udtrykket virker i hvert fald med grep.
Gravatar #6 - Daniel-Dane
8. aug. 2010 15:47
Er det POSIX? Jeg kan kun bruge PCRE. Men glem det nu blot, for jeg har jo fundet svaret.
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.

Opret Bruger Login