PHP + htaccess rewriterule megoldás/agyvérzés?
Kezd az agyamra menni ez a mocsadék .htaccess, mert szó szerint ezerféleképpen próbáltam, és sehogy nem akarja azt, amit én.
Így van felépítve az oldalam:
oldal.hu/index.php: a html keretnek, és az abban történő kiíratásra használom
oldal.hu/menu.php: létrehozza a menüelemeket a következő formátumban: oldal.hu/index.php?site=menuneve
oldal.hu/index2.php: $_GET['site'] alapján összeszedi adatbázisból a szükséges tartalmat
Ezt akartam megoldani rewriterule-al, hogy az URL így nézzen ki:
oldal.hu/menuneve
Ettől függetlenül a $_GET['site'] létezzen, és tudjam használni (az se gond, ha nem megoldható, a $_GET hiánya legyen a legkisebb baj).
A menük hivatkozását már megcsináltam az oldal.hu/menuneve változatra, de a .htaccess-be bármit rakok, vagy nem jön be egyáltalán semmi, vagy hibát jelez, vagy minden jó, csak épp nem jelenik meg se kép, se css, se semmi a sima szövegen kívül.
Jelenleg egy ilyet szedtem össze:
RewriteEngine on
# check that the request url is neither a file nor a directory
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z0-9]+)/([a-z0-9]+)/?$ /index.php?site=$1 [NC,L]
Most az a változat játszik, hogy:
- az oldal bejön így: oldal.hu/index/menuneve
- viszont nem az a tartalom, aminek kéne, mert a $_GET['site'] nem elérhető
- és a css, képek, stb. nem töltődnek be
Legnagyobb probléma az utolsó, mert ha GET nincs, azt legfeljebb megoldom az URL feldarabolásával, de azért a többi igazán sokat dobna az oldal hangulatán :)
Megköszönném a segítséget, mert már egyszerűen kiborít...
UPDATE:
Eljutottam odáig, hogy a következő .htaccess tartalommal az oldal.hu/menuneve/ megjeleníthető úgy, hogy a $_GET['site']-ot tudom használni:
<iFModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([\w\s\.\-\+]+)/(.*)$ index.php?site=$1 [QSA]
RewriteRule ^([\w\s\.\-\+]+)$ index.php?site= [QSA]
</iFModule>
# Force Trailing Slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^[^/]+$ %{REQUEST_URI}/ [L,R=301]
-----------------
Viszont ami még mindig probléma:
- / jel kötelező az URL végére (ezt küszöböltem ki a +3 sorral, viszont a "menu-neve" elemeknél nem működik)
- és a mellékletek így sem töltődnek be, mert a fájlokat a 'menuneve' mappában keresi, amit ha létrehozok, akkor már nem működik a .htaccess sem.
Ezt a / jeles dolgot feltételezem a .htaccess rule prefixben is meglehet adni, csak nem tudom hogy.
A mellékletekre még mindig nincs tippem. Találtam arra is millió megoldást neten, egyik se volt jó akkor, amikor belső hivatkozással akartam meghívni a fájlokat.
Külsővel még nem próbáltam.
Köszönöm a gyors segítséget, így már sikerült megoldanom!
(aldomainen tárolom a fájlokat, és onnan hivatkozok rá,
a / jeles problémát header-el kiküszöböltem)
Egy egyszerűbb rewriterule-val minden gondod megoldódott volna:
RewriteRule ^(.*)$ /index.php?site=$1 [L]
Ez úgy jelenik meg az oldalon, hogy minden oldal.hu/akarmi
hívásnál az akarmi bekerül a $_GET["site"] változóba. Ha a hívás oldal.hu/akarmi/barmi/valami, akkor a $_GET["site"] = "akarmi/barmi/valami" lesz.
Túlbonyolítottad :)
Kis help későbbre: [link]
Köszönöm! :) Igazából a végleges .htaccess már máshogy néz ki:
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([\w\s\.\-\+]+)/(.*)$ index.php?site=$1 [QSA]
# Force Trailing Slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^[^/]+$ %{REQUEST_URI}/ [L,R=301]
----
Viszont 1 problémám még mindig van, (amit az említett aldomaines megoldással küszöböltem ki), hogy a könyvtárakban lévő fájlokat nem érem el, mert ugye a .htaccess az oldal.hu/valami/ címet átirányítja, ezzel együtt a mappákban lévő fájlok helyei is módosulnak. Ezt pedig még külön PHP-ban lekezelni kicsit olyan lenne, mint ha a lábammal vakarnám meg a fülemet :D
Két tippem is volt, de így elméletben az egyik végtelen ciklust eredményezne, a másik pedig szimplán működésképtelenné tenné az oldalt :D Nem tudom az kivitelezhető-e, hogy a rewriterule elé írok kizárási kritériumokat (mappaneveket), és ha az megegyezik az oldalneve.hu/ utáni résszel, akkor nem hajtja végre az átirányítást.
Csak mert ha jól tudom, Last-ként megadva az 5. sor előtt, a fő átirányítás egyáltalán nem fog lefutni.
Ebben a sorban:
RewriteRule ^([\w\s\.\-\+]+)/(.*)$ index.php?site=$1 [QSA]
Ez a rész:
([\w\s\.\-\+]+) teljesen felesleges. Csak annyit csinál, hogy az index.php elé még vár egy mappanevet, különben nem működik az index.php-d.
A trailing slash erőltetését meg felejtsd el. Ha van slash az url végén, akkor mindenképpen lesz GET, csak épp üresen, ami bezavarhat.
A beszúrandó objektumokhoz megfelelő url-eket kell használni. A gondod abból adódik, hogy eleve rossz mappában nyílik meg az oldalad (oldal.hu/valami/index.php?site=...), ezért az lesz az alap kiindulási pont. Az urlben az a "valami" rontja el az egészet.
Csinálhatod azt is, hogy abszolút url-eket használsz. Az oldal inicializáció elején konstansba töltöd a globális url-t, és azt használod a fájlok (css, js, egyéb php) beszúrásakor.
define("MYGLOBAL", " [link]
...
<link rel="stylesheet" type="text/css" media="screen" href="<?php echo MYGLOBAL ?>/css/style.css">
Köszönöm a tartalmas segítséget! :)
Igen, miután jó pár órát kínlódtam vele, már ráébredtem, hogy nem túl kedvező az a könyvtármegoldás, amit átirányítás mentes oldalaknál eddig alkalmaztam.
Egyelőre így marad, mert végül is baj nincs belőle, csak elég kacifántos. Ha lesz hozzá hangulatom, átpakolom egy mappába.
A trailing slash-t pedig azért raktam bele, mert akkor bárhogy van beírva az URL, nem fog rá hibát dobni, de anélkül ha a végéről lemarad a / jel, egyből ugrik a 404.
Mindegy, ha szerinted nem szükséges, akkor kiszedtem.
Ja és kipróbáltam mi történik, ha ezt leszedem az elejéről: ^([\w\s\.\-\+]+)
Végtelen átirányítás. Szóval ezt inkább megtartom :)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!