Reguláris kifejezés Apache URL redirect-hez
2022-06-27T15:29:39+02:00
2022-06-28T19:28:30+02:00
2022-08-12T09:40:31+02:00
DJ_Tacee
Sziasztok! Adott egy weboldal amit hamarosan egy új vált le. A meglévő URL-eket át szeretném irányítani 301-es HTTP státuszkóddal az új párjára. Az URL-ek egy részét manuálisan összepárosítjuk, de a sok ezer termékét nem szeretném kézzel. Két megoldás van előttem:

1: Apache konfig, reguláris kifejezés
2: PHP-val még a routing előtt

Az első megoldás azért tetszik jobban, mert gyorsabb lesz. Az Apache konfig-ba beteszem fixen, induláskor felolvassa, nem kell neki htaccess-t parse-olni, stb. Na de én meg a reguláris kifejezések eléggé távol állunk egymástól. Próbálkoztam, de kellene egy kis segítség. Nézzük:

Itt egy URL (Query string) lista, mintának:

/a-tekozlo-fiu-kifestokonyv-teklits-tamas-p23104/
/quot-eljovok-es-magam-melle-veszlek-quot-jn-14-3-tegez-lajos-p20062/
/biblia-c1/biblia-ruf-2014-nagy-csaladi-p20119/
/mf-alexandra-kiado/eva-wm-paul-young-p23505/

Minden olyan link termék link, aminek a vége egy kötőjel, azt követi egy "p" betű, majd egy szám, ami 20000 vagy magasabb. A végén is van egy "/" jel. Eddig ez a része könnyű. A problémám két helyen keletkezik: van, hogy az URL-ben benne van a gyártó, vagy a kategória. Nekem ez nem kell, hanem csak az utolsó előtti per ("/") jeltől az URL utolsó szegmense. Már itt elakadtam, eddig jutottam:

^\/(.+\/)?(.+-p2\d{4}\/)$

Tegyük fel hogy ezt segítetek megoldani, hogy csak az aláhúzott részt kapjam vissza. Az már jó, de itt jön a második gond: a mostani URL-ekben szerepel itt-ott a "quot" szó. Ez egy rosszul megírt htmlentities()-re alapuló "ékezettelenítő" függvény eredménye, ezeket is ki kell szedni belőle. De nem ám csak úgy hogy replace, hanem ha elől van akkor az őt követő kötőjellel, ha a végén van akkor a megelőző kötőjellel, ha pedig középen van akkor úgy, hogy egy kötőjel maradjon (ahogy nézem lehet az is elég ha ezt dobom el az URL-ből, ami előtte-utána van az marad: "quot-").

Na itt már teljesen elbizonytalanodtam jó-e / elég-e erre a regex, vagy írjam meg mint pre-routing elem és dolgozzam fel PHP-val. Utóbbit 15 perc alatt megírom, de mégis szebb lenne az Apache-os megoldás. A PHP lassabb, előre kell inicializálni a framework-öt, stb. Apache gyorsabb.

Köszönöm előre is, hacsak 1-1 elembe be tud valaki segíteni.
Mutasd a teljes hozzászólást!

abcd