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.
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!
- WittnerIsComingválasza DJ_Tacee (15:29) részére
- 2022.06.27. 19:34
- permalink
Szia!
A regexp esetleg:
^\/(.+\/)?([^\/]+-p2\d{4}\/)$
Mutasd a teljes hozzászólást!- DJ_Taceeválasza WittnerIsComing (19:34) részére
- 2022.06.27. 19:45
- permalink
Frappáns megoldás, köszi! :) Játszom még vele hogy ki tudom-e szedni a nem szükséges elemeket, de egyre inkább úgy érzem ebből PHP-s feldolgozás lesz, ahhoz legalább értek.Mutasd a teljes hozzászólást!- WittnerIsComingválasza DJ_Tacee (19:45) részére
- 2022.06.28. 17:37
- permalink
A quot-os leírást nem teljesen értem, de valami ilyesmi lehetne:
RewriteCond %{REQUEST_URI} "^/forras/" RewriteRule "(.+)-quot-(.+)" "$1-$2" [N] RewriteRule "(.*[^-])quot-(.+)" "$1-$2" [N] RewriteRule "(.+)-quot([^-].*)" "$1-$2" [N] RewriteRule "^\/(.+\/)?(.+-p[2-9]\d{4}\/)$" "http://masik.com/target-prefix/$2" [R,L]
RewriteCond %{REQUEST_URI} "^/forras/" RewriteRule "(.+)-quot-(.+)" "$1-$2" [N] RewriteRule "(.*\/)quot-(.+)" "$1-$2" [N] RewriteRule "(.+)-quot(\/.*)" "$1-$2" [N] RewriteRule "^\/(.+\/)?(.+-p[2-9]\d{4}\/)$" "http://masik.com/target-prefix/$2" [R,L]
A flag-ek: N - többször is futtassa a szabály, amíg illeszkedik (kb.: global replace) R - redirect, L - last.
A forras, target-prefix, stb. persze szükség szerint alakítható.Mutasd a teljes hozzászólást!- DJ_Taceeválasza WittnerIsComing (17:37) részére
- 2022.06.28. 19:28
- permalink
Hú. Nem semmi! Na ezt megemésztem... Köszönöm!Mutasd a teljes hozzászólást!