“Sok tonnányi leírás és példa ellenére a mod_rewrite voodoo. Átkozottul jó voodoo, de még mindig csak voodoo.”
(Brian Moore)
Mivel magyarul egyáltalán nem találtam egy normális összefüggő leírást az Apache mod_rewrite moduljáról, figyelembevéve a fenti kijelentést, gondoltam megpróbálok összeállítani egy rövid, összefoglaló cikket erről a jól konfigurálható ügyes kis modulról.
Előszőr nézzük a konfigurációs beállításokat, aztán pedig hozzunk létre egy saját .htaccess file-t ezek alapján!
Konfigurációs beállítások
RewriteEngine
Szintakszis: RewriteEngine on|off
A
RewriteEngine direktívával engedélyezhetjük vagy tilthatjuk a Rewrite
modul futását. Alapértelmezésben off-ra van állítva, és ha tiltani
akarjuk a Rule-okat akkor célszerű ezt off-ra állítani mindne egyes
Rule kikommentezése helyett.
RewriteOptions
Szintakszis: RewriteOptions Opció
Ezzel a direktívával speciális beállításokat kapcsolhatunk be. Az opciók a következők lehetnek:
- inherit
- A jelenlegi konfiguráció a szülő konfigurációját
örökli. Ez virtuális szervernél a fő szerver szabályainak az öröklését
jelenti, a .htaccess file esetében a szülő könyvtár .htaccess file
beállításainak öröklését jelenti. - MaxRedirects=szám
- Annak elkerülése érdekében, hogy a
szabályaink végtelen ciklust hozzanak létre az alapbeállítás 10, vagyis
10 átírányítás után az átirányítások leállnak egy “500 Internal Server
Error”-ral.
RewriteLog, RewriteLogLevel, RewriteLock, RewriteMap
Ezeket a beállításokat nem lehet a lokális .htaccess fileokból
állítgatni. Így ezekről most nem írok, aki kíváncsi rájuk olvassa el a
forrásoknál felsorolt linkeken.
RewriteBase
Szintakszis: RewriteBase URL
Ez
a direktíva beállítja az alap URL-t a könyvtárfüggő (.htaccess)
szabályokhoz. Az itt megadott könyvtárnév automatikusan le lesz véve a
vizsgált URL-ből és a szabályok végén automatikusan hozzáadásra kerül.
Ha a webszerver URL-jei nem közvetlenül feleltethetőek meg a
fizikai file elérési utakkal, akkor minden .htaccess fileban használni
KELL a RewriteBase direktívát ha használni akarod a RewriteRule
direktívát is.
RewriteCond
Szintakszis: RewriteCond TesztString FeltételMinta
A
RewriteCond direktívával tudunk feltételes szabályokat létrehozni. Az
ezt követő RewriteRule csak akkor kerül végrehajtásra, ha maga a
szabály és az őt megelőző RewriteCond is teljesül.
A TesztString a következő elemekkel egészíthető ki:
- RewriteRule hivatkozás $N
- (0 <= N <= 9) ami elérést biztosít a kapcsolódó RewriteRule mintában található zárójelekkel létrehozott részhez.
- RewriteCond hivatkozás %N
- (1 <= N <= 9) ami elérést biztosít a legutolsó egyező RewriteCond minta részeihez.
- RewriteMap bővítés ${mapname:key|default}
- Szerver változók %{VÁLTOZÓ}
- ahol a szerverváltozók a következők lehetnek:
- HTTP_USER_AGENT
- HTTP_REFERER
- HTTP_COOKIE
- HTTP_FORWARDED
- HTTP_HOST
- HTTP_PROXY_CONNECTION
- HTTP_ACCEPT
- REMOTE_ADDR
- REMOTE_HOST
- REMOTE_USER
- REMOTE_IDENT
- REQUEST_METHOD
- SCRIPT_FILENAME
- PATH_INFO
- QUERY_STRING
- AUTH_TYPE
- DOCUMENT_ROOT
- SERVER_ADMIN
- SERVER_NAME
- SERVER_ADDR
- SERVER_PORT
- SERVER_PROTOCOL
- SERVER_SOFTWARE
- TIME_YEAR
- TIME_MON
- TIME_DAY
- TIME_HOUR
- TIME_MIN
- TIME_SEC
- TIME_WDAY
- TIME
- API_VERSION
- THE_REQUEST
- REQUEST_URI
- REQUEST_FILENAME
- IS_SUBREQ
A FeltételMinta egy sztenderd reguláris kifejezés pár kiegészítéssel.
- A minta előtt meg lehet adni egy !-et, ezzel tagadjuk a mintát,
vagyis az ezt követő szabály akkor kerül végrehajtásra, ha a TesztSring
nem passzol a megadott mintára - Elérhető pár speciális FeltételMinta megadása is. Reguláris kifejezés helyett használhatók a következők:
- <'FeltételMinta'
- A feltételMintát sima sztirngként kezeli és azt vizsgálja, hogy lexikálisan kisebb-e mint a TesztString.
- ‘>FeltételMinta’
- A feltételMintát sima sztirngként kezeli és azt vizsgálja, hogy lexikálisan nagyobb-e mint a TesztString.
- ‘=FeltételMinta’
- A feltételMintát sima sztirngként kezeli
és azt vizsgálja, hogy lexikálisan megyezik-e a TesztStringgel, azaz
betűről betűre azonosak-e. - ‘-d’ (könyvtár?)
- Megvizsgálja, hogy a TesztString egy létező könyvtár-e.
- ‘-f’ (file?)
- Megvizsgálja, hogy a TesztString egy létező file-e.
- ‘-s’ (file mérettel?)
- Megvizsgálja, hogy a TesztString egy létező file-e és mérete nagyobb-e mint 0.
- ‘-l’ (szimbolikus link)
- Megvizsgálja, hogy a TesztString egy szimbolikus link-e.
- ‘-F’ (létező file via subrequest)
- Megvizsgálja, hogy a
TestString egy létező file-e, és elérhető-e a szerver konfigurációjában
szereplő elérési korlátozások szerint. - ‘-U’ (létező URL via subrequest)
- Megvizsgálja, hogy a
TestString egy létező URL-e, és elérhető-e a szerver konfigurációjában
szereplő elérési korlátozások szerint.
Ezeket kiegészítve használhatók az alábbi flag-ek (vesszővel elválasztott listaként) is mint a RewriteCond direktíva harmadik argumentuma.
- ‘nocase|NC’ (no case: ne figyelje a betűméretet)
- Ennek a
flag-nek a hatására a FeltételMinta és a TesztString nem lesz érzékeny
a kis és nagybetűk közötti különsbségre, azokat azonosnak tekinti. - ‘ornext|OR’ (or next condition: vagy a következő feltétel)
- Ennek
a flag-nek a hatására az alapértelmezett ÉS logikai kapcsolat helyett
az egyes RewriteCond direktívákat VAGY logikai kapcsolattal kezelhetjük.
RewriteRule
Szintakszis: RewriteRule Minta Helyettesítés
A
RewriteRule directíva a tényleges URL átíró utasítás. A directíva több
mit egyszer is előfordulhat, külön-külön szabályt alkotva. A szabályok
sorrendje fontos, mert a .htaccess file-ban lévő sorrendben hajtódnak
végre.
A Minta egy reguláris kifejezés amit az
aktuális URL-lel hasonlít össze a szabály. Az aktuális itt azt jelenti,
hogy ezt a szabályt megelőző szabályok már modósíthatták az eredeti, a
user által beírt URL-t.
Pár szóban a reguláris kifejezésekről.
A reguláris kifejezés egy minta amit egy karaktersorozat általános
leírására, összehasonlítására alkalmazhatunk. A következő táblázat
mutatja, hogy melyik jel mely karaktereket helyettesít a reguláris
kifejezésekben.
- Szöveg
- . (pont)
- Bármilyen karakter
- [karakterek]
- Karakter osztály: bármely a zárójelek között felsorolt karakterek közül
- [^karakterek]
- Karakter osztály: egy sem a zárójelek között felsorolt karakterek közül
- szöveg1|szöveg2
- Alternatívák: szöveg1 vagy szöveg2
- Számlálók
- ?
- 0 vagy 1 a megelőző szövegből
- *
- 0 vagy több a megelőző szövegből
- +
- 1 vagy több a megelőző szövegből
- Csoportosítás
- (szöveg)
- Szöveg részekre bontása zárójelekkel, vagy
határolóelemként alternatív szövegek meghatározásához, vagy padig
hivatkozások létrehozásához ($N)
- Helymeghatározók
- ^
- A szöveg eleje
- $
- A szöveg vége
- Escaping
- karakter
- Ezzel tiltjuk, hogy egy speciális karakter speciálisan legyen értelmezve
A Helyettesítés egy sztring ami az
eredti mintát helyettesíti vagy kiegészíti. Használhatók benne a
hivatkozások melyek a szabályra utalnak ($N), hivatkozások melyek a
feltételre utalnak (%N), szerver változók és mapping funkciók.
Speciális
helyettesítő parancs a ‘-‘, aminek a hatására nem történik
helyettesítés. Ez első olvastra furán hangzik, de a ‘C’ flag
ismeretében értelmet fog nyerni.
A RewriteRule direktíva harmadik argumentumaként használhatjuk az alábbi flag-eket:
- ‘redirect|R [=code]’ (force redirect)
- Közvetlen
átirányítás. A Helyettesítés-nek egy létező URL-nek kell lennie,
máskülönben egy nemlétező helyre irányítjuk át a usert. - ‘forbidden|F’ (force URL to be forbidden)
- Egy 403-as HTTP response-t (FORBIDDEN) küld vissza. Egy ehhez tartozó RewriteConds direktívával blokkolhatunk bizonyos URL-eket.
- ‘gone|G’ (force URL to be gone)
- eEgy 410-es HTTP response-t
(GONE) küld vissza. Többé már nem létező lapokat jelölhetünk meg vele.
(pl azzal a céllal, hogy a keresők kivegyék az indexükből az oldalt.) - ‘proxy|P’ (force proxy)
- A kérés proxy kérésként lesz kezelve, így automatikusan átadódik a proxy modulnak.
- ‘last|L’ (last rule)
- Megállítja az átíró folyamatot ennél a szabálynál, nem hajtja végre az ezt követő szabályokat.
- ‘next|N’ (next round)
- Újraindítja az átíró folyamatot
(újrakezdi az első szabálynál). Ebben az alfolyamatban nem az eredeti
URL-t fogja vizsgálni, hanem az éppen aktuálisat. - ‘chain|C’ (chained with next rule)
- Összekapcsolja a
jelenlegi szabályt a következővel. Ha a szabály egyezik akkor a normál
menet szerint a következőt is vizsgálni fogja, de ha a jelenlegi
szabály nem egyezik akkor a következőt NEM vizsgálja. - ‘type|T=MIME-type’ (force MIME type)
- A cél file MIME-type-ját állítja be./dd>
- ‘nosubreq|NS’ (used only if no internal sub-request)
- ‘nocase|NC’ (no case)
- A mintát érzéketlenné teszi a kis és nagybetűk közötti különbségekre.
- ‘qsappend|QSA’ (query string append)
- A jelenlegi URL-hez hozzá tudunk fűzni további adatokat.
- ‘noescape|NE’ (no URI escaping of output)
- Ne használja az escape eljárást
- ‘passthrough|PT’ (pass through to next handler)
- ‘skip|S=num’ (skip next rule(s))
- Ha a jelenlegi szabály végrehajtódik akkor a következő ‘num’ db szabályt nem vizsgája, nem hajtja végre.
- ‘env|E=VAR:VAL’ (set environment variable)
Minta .htaccess file
Először is kapcsoljuk be a RewriteEngine-t és maximalizáljuk a lehetséges átírások számát, nehogy végtelen ciklusba jussunk.
<IfModule mod_rewrite.c> RewriteEngine on RewriteOptions MaxRedirects=10 </Ifodule>
Adjuk meg az alkönyvtár nevét is amiben éppen vagyunk,
ahhhoz, hogy az átírásaink jól működjenek. Ez persze nem kell ha a
websiteunk főkönyvtárában lévő .htaccess filet szerkesztjük.
RewriteBase /gora
Első lépésként azt szeretnénk, hogy a CMS-ünk által
generált rendkívül rusnya URL-t emberek számára is olvashatóvá tegyük.
http://webmania.cc/index.php?modul=recept&recept=23 URL-t
szeretnénk egyszerűsíteni és átirni a http://webmania.cc/receptek/23
formátumra. Illetve ez nem teljesen igaz. Azt szeretnénk, hogy ha a user (vagy maga a CMS) egy http://webmania.cc/receptek/23 kinézetű URL-t kér le a webszervertől, akkor az ezt a háttérben, a user számára láthatatlanul alakítsa át arra a valódi URL-re amin ez a tartalom megtalálható (http://webmania.cc/index.php?modul=recept&recept=23)
A szabályban a $2 a második zárójelek közötti részt jelenti, vagyis esetünkben a 23-at, a harmadik zárójelben lévő kifejezés pedig arra szolgál, hogy akár perjellel, akár a nélkül zárja le a user a beírt URL-t a szabályunk működjön. Mivel ha a vizsgált URL illeszkedik erre a mintára már nem akarunk semmilyen más átalakítást végezni vele kitesszük az [L] flaget.
Az átírási szabályoknál figyelni kell a következőre. Esetünkben ha van a domainünknek egy a receptek mintára illeszkedő file-ja / könyvtára, akkor az oda mutató linkek használhatatlanná válhatnak. Pl az “imgrecept” nevű könyvtárban lévő képek elérhetetlenné válnak, mivel a szabályunk a http://webmania.cc/imgrecept/borfi.jpg hivatkozást át fogja alakítani a http://webmania.cc/index.php?modul=recept URL-re. Ez ellen két módon védekezhetünk. Vagy gondoskodunk arról, hogy a létező fileokat kiszolgálja, vagy pedig óvakodunk az olyan hivatkozások használatától aminek a mintája illeszkedik valamely létező könyvtár vagy filenévre.
RewriteRule ^(.*)receptek/([^/]+)(/*)$ index.php?modul=recept &recept=$2 [L]
Ugyanezzel a módszerrel alakítsuk át a http://webmania.cc/index.php?lap=17 típusú hivatkozásokat. Ezt mondjuk úgy szeretnánk olvasható URL-lé alakítani, hogy http://webmania.cc/lap/17.
#kategoriák rövid számos elérése RewriteRule ^(.*)lap/(.*)$ index.php?lap=$2 [L]
Hasonlóan a http://webmania.cc/index.php?kategoria=17 is ronda egy URL. Ez mondjuk egy kiemelt téma, kétféleképpen is szeretnénk átalakítani (a sorrend ugye fontos):
- http://webmania.cc/rovat/17
- http://webmania.cc/hirek (bizonyos feltétel esetén, mondjuk a domain név alapján ha a .htaccess fileunk több domaint is kiszolgál)
#kategoriák rövid számos elérése RewriteRule ^(.*)rovat/(.*)$ index.php?kategoria=$2 [L] #weblap specifikus rész #krisnavolgy.hu RewriteCond %{SERVER_NAME} krisnavolgy.hu RewriteRule ^(.*)hirek(.*)$ index.php?kategoria=17 [L]
Itt is használtuk az [L] flaget, mert nem kívánunk több átalakítást végezni ha a minta passzol. A weblapspecifikus rész csak akkor fog végrehajtódni, ha a feltétel teljesül, vagyis ha a domainnév krisnavolgy.hu. RewriteCond esetén figyelnünk kell arra, hogy csak a közvetlenül utánna következő egy RewriteRule-ra fog a feltétel érvényesülni. Tehát ha több szabályt is akarunk alkalmazni ugyanarra a feltételre akkor azt többször meg kell adni.
Végül ha a user nemlétező URL-t akar meghívni akkor irányítsuk rá a nyitóoldalra, és az általa kért nemlétező címet tegyük be a hack nevű $_GET változóba.
#ha nincs favicon RewriteCond %{REQUEST_FILENAME} !favicon.ico [NC]
#ha nemlétező a file RewriteCond %{REQUEST_FILENAME} !-f
#ha nemlétező a könyvtár RewriteCond %{REQUEST_FILENAME} !-d #akkor legyen átirányítás RewriteRule ^(.*)$ index.php?hack=$1 [QSA]
És akkor lássuk az egészet együtt.
<IfModule mod_rewrite.c> RewriteEngine on RewriteOptions MaxRedirects=10
#Ebben az alkonyvtarban vagyunk, ezt figyelembe kell venni RewriteBase /gora
RewriteRule ^(.*)receptek/([^/]+)(/*)$ index.php?modul=recept &recept=$2 [L] RewriteRule ^(.*)receptek$ index.php?modul=recept [L]
#a lap/72 tipusúak átírása RewriteRule ^(.*)lap/(.*)$ index.php?lap=$2 [L] #kategoriák rövid számos elérése RewriteRule ^(.*)rovat/(.*)$ index.php?kategoria=$2 [L] #weblap specifikus rész #krisnavolgy.hu RewriteCond %{SERVER_NAME} krisnavolgy.hu RewriteRule ^(.*)hirek(.*)$ index.php?kategoria=66 [L] RewriteCond %{SERVER_NAME} krisnavolgy.hu RewriteRule ^(.*)naplo(.*)$ index.php?kategoria=111 [L] #Minden nemletezo oldal webcimet iranyitsuk at az index.php-re #ennek a végén kell lennie, mert máskülönben #a rövidítendő webcímeket is kiszűri #ha nincs favicon RewriteCond %{REQUEST_FILENAME} !favicon.ico [NC] #ha nemlétező a file RewriteCond %{REQUEST_FILENAME} !-f #ha nemlétező a könyvtár RewriteCond %{REQUEST_FILENAME} !-d #akkor legyen átirányítás RewriteRule ^(.*)$ index.php?hack=$1 [QSA] </IfModule>
URL átírások
Egyszerűsített URL-ek
- Leírás:
- Néhány webszerveren több mint egy URL tartozik egy forráshoz. Ezek általában egyszerűsített URL-ek (melyek könnyen megjegyezhetőek), vagy gyorslinkek, stb. Függetlenül attól, hogy a user melyik URL-t írta be végül az egyszerűsítettet kell látnia.
- Megoldás:
- Egy külső HTTP átirányítást fogunk alkalmazni a nem egyszerűsített URL-ek esetében, hogy a böngészők Hely (Location) mezőjében az egyszerűsítettek jelenjenek meg. Példánkban a /~user-t fogjuk az egyszerűsített /u/user-re fogjuk átírni és hozzáadunk egy záró perjelet.
RewriteRule ^/~([^/]+)/?(.*) /u/$1/$2 [R] RewriteRule ^/([uge])/([^/]+)$ /$1/$2/ [R]
Egyszerűsített hostnevek
- Leírás:
- Ennek a szabálynak az a célja, hogy ráerőszakoljuk a userra, hogy egy bizonyos hostnevet használjon más hostnevek helyett amelyeket ugyanehhez a weblaphoz használhatna. Például azt akarjuk, hogy a www.kivagyok.hu hostnevet akarjuk a userekkel használtatni a sima kivagyok.hu helyett.
- Megoldás:
- Ha a site nem a 80-as porton fut:
RewriteCond %{HTTP_HOST} !^www.kivagyok.hu [NC] RewriteCond %{HTTP_HOST} !^$ RewriteCond %{SERVER_PORT} !^80$ RewriteRule ^/(.*) http://www.kivagyok.hu: %{SERVER_PORT}/$1 [L,R]
Ha a site a 80-as porton fut:
RewriteCond %{HTTP_HOST} !^www.kivagyok.hu [NC] RewriteCond %{HTTP_HOST} !^$ RewriteRule ^/(.*) http://www.kivagyok.hu/$1 [L,R]
Virtuális hostok
- Leírás:
- Ha szeretnénk egy www.felhasznalonev.host.hu nevet egy felhasználó weboldalaként virtulahost nélkül, akkor…
- Megoldás:
- HTTP/1.0 requestekhez nincs megoldás, de HTTP/1.1 requesteknél ami tartalmaz egy Host: HTTP header, akkor használhatjuk a következő szabályokat ahhoz, hogy átírjuk a http://www.felhasznalonev.host.hu/balamber-t /home/balamber/barmi-ra:
RewriteCond %{HTTP_HOST} ^www.[^.]+.host.hu$ RewriteRule ^(.+) %{HTTP_HOST}$1 [C] RewriteRule ^www.([^.]+).host.hu(.*) /home/$1$2
Időpontfüggő átirányítás
- Leírás:
- Például egy időpont függő megjelenéshez általában valami scriptet hazsnálunk (például PHP-t), de hogyan tudjuk ezt a mod_rewrite-on keresztül?
- Megoldás:
- Van egy rakat változó, a TIME_xxx. Ezeket a lexikális összehasonlítással, vagyis a > < és = jelekkel tudjuk vizsgálni.
RewriteCond %{TIME_HOUR}%{TIME_MIN} >0700 RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900 RewriteRule ^foo.html$ nappal.html RewriteRule ^foo.html$ ejszaka.html
Ezzel a szabállyal ezt érjük el, hogy reggel 7 és este 7 között a nappal.html fog megjelenni, a többi időben pedig az ejszaka.htm. Ha ezeknek eltérő a tartalma, vagy a designja, akkor az elég izgalmas, nem?
Robot-elérés korlátozás
- Leírás:
- Hogyan tudunk egy zavaró robotot kitiltani a webszerverünk egy bizonyos területéről? A /robots.txt nem mindig elég ahhoz, hogy egy erőszakos robotot kitiltsunk.
- Megoldás:
- A lenti szabály letiltja a /~quux/foo/arc/ könyvtár elérését a robot részére. Ügyelnünk kell arra, hogy csak a robotot tiltsuk ki és a felhasználók hozzáférhessenek az oldalhoz. Ehhez megnézzük, hogy a HTTP_USER_AGENT változóban a robot neve van-e, és azt, hogy arról az IP címről jön-e ahonnan a robot szokott. Ha igen akkor küldünk neki egy “Felejts már el!” [F] üzenetet.
RewriteCond %{HTTP_USER_AGENT} ^aCsunyaRobotNeve.* RewriteCond %{REMOTE_ADDR} ^123.45.67.[8-9]$ RewriteRule ^/~quux/foo/arc/.+ - [F]
Források:
- http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html
- http://httpd.apache.org/docs/1.3/misc/rewriteguide.html
Így hivatkozok a képekre a php-ban:
“pics/background.jpg”
A képek a gyökérkönyvtár/pics -ben vannak.
Az átalaktás után a fotermekcsoport-1/altermekcsoport-5/pics -ben keresi őket.
A többi része működik a: .php lejön a fő és alkategóriákat tökéletesen kilistázza, már csak ezt kéne megoldani.
Köszi
Szia!
Olyan jelegű problémám lenne, hogy adott egy virtuális link:
Pl.:
oldal.hu/focsoport/alcsoport/alalcsoport.html
Szeretném lekérdezni a path-ot.
Természetesen “PHP_SELF”-el próbáltam, de az a valós path-ot adja hanem: oldal.hu/webshop.php
Néztem “SCRIPT_FILENAME”, “SCRIPT_NAME”, “PATH_TRANSLATED”, “REQUEST_URI”-al de ugyanez a helyzet.
A “HTTP_REFERER” tökéletes lenne csak az meg ugye mindig az előző oldal linkjét adja meg, nekem a jelenlegi használatba lévő teljed virtuális link kellene.
Előre is köszi a segítséget.
Johny: Gondolom az url alapján változókat adsz hozzá, szóval a $_GET tömbben ott kell lennie annak amit keresel.
Szia!
Virtuális hostokat szeretnék megvalósítani, user.domain.hu-t átirányítani domain.hu/users/user címre.
Már nagyjából meg is vagyok, http://user.domain.hu-ra remekül működik is a kód. Még azzal szeretném kiegészíteni, hogy http://www.user.domain.hu -ról változzon a cím http://user.domain.hu-ra.
Sehogy sem boldogulok a www-és résszel, a kódom a következő:
RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain.hu$ [NC]
# ha a cím http://www.domain.hu volt akkor nem
RewriteCond %{HTTP_HOST} !^www.domain.hu [NC]
RewriteRule ^(.*)$ users/%1/index.php [QSA,L]
Ha van valami ötleted, akkor azt szívesen fogadom.
Köszi
Csaba
Csaba: nem tudom olvastad-e a cikket itt egy kicsit feljebb de ott van benne a pontos válasz. Egyszerűsített hostnevek
Szia rrd!
Én csak azt szeretném megkérdezni, hogyha egyszer már készítettem egy ilyet:
RewriteRule ^([a-zA-Z0-9_]+)/?([0-9]*)/?(.*)/?(.*)$ index.php?contentid=$1&cat_id=$2&menu_id=$3 [L,QSA]
és ez megy is rendesen, akkor mégegy hasonlót már nem lehet?
Pl egy ilyet:
RewriteRule ^([a-zA-Z0-9_]+)/?([0-9]*)/?(.*)/?(.*)$ index.php?contentid=$1&tema_id=$2&cikk_id=$3 [L,QSA]
?
mert annak idelyén úgy készítettem el az oldalt, hogy a contentid válogatja le hogy mit akarok meghívni. és szóval így mind a kettőre szűkségem lenne, de nem akar menni.
Segítséged előre is köszönöm!
Yenka: Ugyanazt a rule-t nem irányíthatod kétfelé. Amikor a sorrendben előbb álló rule érvényesül a string átalakul, ha ott az L flag akkor a rewrite ki is lép. Ha nincs L flag akkor ugyan továbblép, de akkor már az átalakított stringet hasonlítja a következő rule-hoz.
De ha mindkettőre szükséged van akkor miért nem házasítod össze a két rule-t eggyé?
Köszönöm a gyors választ!
Igazából azért nem házasítom össze, mert nem tudom, hogy hogy kell.
Ezt a dolgot, még csak most tanulom, és még nem sok mindent tudok belőle.
Hogy álljak neki? Vagy hol találok erről a dologról egy kis leírást? Már kerestem sok helyen, de sehol nincs róla egy kimerítő leírás, persze a tiéden kívül!
Yenka: attól függ mit is szeretnél, de ha végigolvasod a cikket akkor össze kéne tudnod rakni.
Az összeházasítás valahogy így nézne ki:
RewriteRule ^([a-zA-Z0-9_]+)/?([0-9]*)/?(.*)/?(.*)$ index.php?contentid=$1&cat_id=$2&menu_id=$3&tema_id=$2&cikk_id=$3 [L,QSA]
Köszönöm!
Közben már átolvastam, újra legalább 3-szor, és sikerült is megoldanom!
Köszönöm még egyszer!
Szia
Köszönöm a részletes leírást. Olyan megoldást keresek, ahol általánosan tudok átadni paramétereket az url-ben.
Például:
domain.hu/par1/par2/par3 (és / jel opcionálisan a végén)
Ebből:
index.php?p1=par1&p2=par2&p3=par3
Tudnál segíteni a regex formulánál? Az alábbi kód sajnos nem minden esetben ad jó eredményt.
RewriteEngine on
RewriteRule ^(.+)/(.+)/(.+)/?$ index.php?p1=$1&p2=$2&p3=$3 [L]
RewriteRule ^(.+)/(.+)/?$ index.php?p1=p1&p2=$2 [L]
#RewriteRule ^(.+)/?$ index.php?p1=$1 [L]
Hiába illeszkedik az első sorra az url, nem áll le a kiértékelés és az utolsó sor agyonvágja az eredményt; a / jel a sor végén az utolsó paraméterhez csapódik; és 3-nál több paraméter esetén a p1 éréke pl. “par1/par2”
Köszönöm a segítséget…
pan: az L flag után nem megy tovább valami más lesz a hiba. Sajnos nincs módom letesztelgetni, hogy nálad mi lehet a gond, de valószínűleg a regex körül sántít valami.
Itt tesztelhetsz: http://webmania.cc/static/pregteszt.php
Kösz a választ. A
RewriteEngine on
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?p1=$1&p2=$2&p3=$3 [L]
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?p1=$1&p2=$2 [L]
RewriteRule ^([A-Za-z0-9-]+)/?$ index.php?p1=$1 [L]
jónak tűnik. Pesze kiszűri az alkönyvtárakban levő fájlokat.
Van mód arra, hogy ha pontot tartalmaz a domain.hu/ utáni rész (ez fájlra való hivatkozást jelent), akkor ne csináljon semmit az url-lel és fejezze be a feldolgozást?
Tehát, ha ^(.*)\.(.*)$ akkor ne csináljon semmit az url-lel
pan: a létező címek (alkönyvtárak) változatlanul hagyását egy RewriteCond segítségével tudod megoldani. Fent több helyen is szerepel a ha nem favicon, ha nem létező könyvtár és ha nem létező fájlról van szó akkor… típusú példa.
Kösz a választ.
A fenti kód (előző post) szerencsére megoldja a file problémát, mert a file-ok tartalmaznak pontot, így eleve nem felelnek meg a kritériumnak.
Ami viszont továbbra is probléma, hogy valamiért a
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$
regex maszk illeszkedik pl. a
domain.hu/par1////par2/par3
url-ekre is (több / jel egymás után). Valamiért nem tesz különbséget, hogy csak egyszer vagy többször szerepel a / jel.
pan: nem illeszkedik
Valóban nem, de az apache regex mégis elfogadja.
Például a
http://webmania.cc////////url-atirasok-apache-mod-rewrite/
gond nélkül megy.
Ez Apache probléma…
szia.
lehet hogy nem idevaló a problem, de hátha tud segiteni valaki.
2 dyndns cim ugyarra az ip-re mutat
router a 80-as portra bejövő kéréseket az egyik gép apacheának dobja és azt szeretném hogyha a kérés http://másik.gép.dyndns.neve/ alapu akkor a válasz másik gépen (csak a belső hálón elérhető) futó apacheon keresztül jöjjön. rewriterule ^/.* http://192.168.1.100/$1 persze nem jó. úgy meg lehetne oldani hogy más porton jöjjenek a másik gépnek szóló kérések és a router virtualserver szekciója válogasson. de én azt szeretném ha mindkét gép a 80-as porton volna elérhető
köszi
Szia,
Klassz irás, használható. A napokban találtam egy hasonló oldalt, szivesen belinkelem, esetleg ez alapján még néhány részt frissíthetsz a tartalmon.
a link:
http://www.askapache.com/htaccess/ultimate-htaccess-file-sample.html
Szia!
Nekem az a problémám, hogy a szerveren a következő könyvtárra mutat a virtualhost:
/var/www/valami
De maga a weboldal fizikailag itt van:
/var/www/valami/webroot
Eddig a /var/www/valami könyvtárba tettem egy index.php-t, amiben egy sima header-es átirányítás volt a webroot könyvtárra. Működik, de bután néz ki az URL a böngészőben, hogy http://www.weboldal.hu/webroot/index.php
(ez szebb lenne: http://www.weboldal.hu)
Azt szeretném, hogy a /var/www/valami könyvtárba az index.php helyett egy .htaccess fájl segítségével automatikusan átirányítsam a /var/www/valami/webroot könyvtárra…és onnan fusson az index úgy, hogy az URL-ben ez legyen: http://www.weboldal.hu/index.php
Huhh, elég hülyén fogalmaztam, remélem azért érthető valamennyire.
Tudsz segíteni?
Eddig kb ennyit hoztam össze, de nem megy:
RewriteEngine on
Options +FollowSymLinks
RewriteOptions MaxRedirects=10
RewriteRule ^/webroot/(.*)$ http://www.weboldal.hu/$1 [R=301,L]
Köszi
Ludowico
@Ludowico nem lenne kézenfekvőbb a webroot könyvtárból egy szintel feljebb másolni az egész cuccodat?
Lehetne…, vagy akár átírni a httpd.conf-ban a virtualhost elérési útját, hogy a beljebb levő könyvtárra mutasson, de sajnos egyikre sincs lehetőség, hogy miért, azt most nem részletezném.
Ezért is gondoltam a rewrite-ra.
Na, már nem is érdekes, mert közben meglett a megoldás:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/webroot(.*)
RewriteRule (.*) /webroot/$1 [L]
Sziasztok!
Az lenne a kérdésem, hogy mi van akkor ha több paraméter is tartozik egy urlhez viszont nem minden esetben kap mindegyikhez értéket és ekkor hiba jelentkezik.
Példa:
RewriteRule ^hirdetes/([^/]+)/([^/]+)/([^/]+)/?$ /hirdetes.php?hely=$1&targy=$2&page=$3 [L,NC]
és valamikor csak így hívjuk meg az oldalt:
/hirdetes/valahol/
és ilyenkor hiba keletkezik mivel nem adom meg a targy és a page paraméterét.
Szóval a lényeg mit kell tennem, hogy ne akadjon meg ha csak kevesebb paramétert kap az URL?
Válaszotokat előre is köszönöm.
Végigolvastam az oldalt, és többnyire szép url-eket akartok paraméteres getváltozos url-ekre alakitani. És nem is értem h miért, azt meg lehet php-vel oldani, de nem az a lényeg h a locationben szép, userfriendly url látszodjon és a gugli is szeresse? Én az ellenkezőjét akarom, de a példában irt:
RewriteRule ^/~([^/]+)/?(.*) /u/$1/$2 [R]
RewriteRule ^/([uge])/([^/]+)$ /$1/$2/ [R]
nalam nem csinal semmit a http://www.host.com/~user cimre, bár más szabályok működnek, tehat van rewrite modul. És nem értem miért van 2 sor, és mi az az uge.
Amit akarok az az hogy a:
http://www.host.com/?tema1=vmi1&tema2=vmi2 -ből vagy a
http://www.host.com/index.php?tema1=vmi1&tema2=vmi2 -ből
http://www.vmi1.host.com/vmi2 legyen
ill.:
http://www.host.com/?t1=vmi1&t2=vmi2 -ből vagy a
http://www.host.com/index.php?t1=vmi1&t2=vmi2 -ből
http://www.host.com/vmi1/vmi2 legyen
htacces:
RewriteEngine on
RewriteOptions MaxRedirects=10
#RewriteRule ^/~([^/]+)/?(.*) /u/$1/$2 [R]
#RewriteRule ^/([uge])/([^/]+)$ /$1/$2/ [R]
#RewriteRule (.*)index.php\?module=(.*)&target=(.*) /vanq/$1/$2/ [R]
#RewriteRule (.*)index.php(.*) /vanq/$1/ [QSA,R]
fenti 4gyel probalkoztam, de mint irtam az első 2 nem csinal semmit, a példa urled-re sem, a másik 2 meg nem azt csinalja amit kéne neki, segítenél?
köszi
@shamanix olvasd el mégy egyszer a cikket figyelmesen minden benne van. A ~user kezeléséhez a RewriteBase direktívát kell használni a ~user home könyvtárában. Valószínűleg a mintáid rosszak itt tesztelheted: http://webmania.cc/static/pregteszt.php
mintaim pont mint a példa mintáid a reg.exp.tesztelődben:
RewriteEngine on
RewriteOptions MaxRedirects=10
RewriteCond %{REQUEST_FILENAME} !favicon.ico [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^http://www.(.*)/index.php\?modul=(.*)&target=(.*)$ http://www.$1/$2/$3 [R]
nem csinal semmit: http://www.host.com/index.php?modul=home&target=ter url-re.
@shamanix A RewriteRule-nál nem kellenek a http-k, ez csak külső átirányítás esetén jöhetne szóba.
De még mindig azt mondom, hogy nem kaptad el, hogy mit szeretnél 🙂
A RewriteRule első szabálya azt mutatja, hogy mi jön az url-ben. Pl amit te írsz az az, hogy az url-ben ilyesmi jön: http://akarmi.hu/index.php?modul=modulNev&target=targetNev. A szabályod szerint valami ilyesmire akarod alakítani: http://akarmi.hu/modulNev/targetNev, azaz a webszerver ezt az url-t fogja megkapni feldogozásra. De létezik ez az elérési út a szerveren? Gondolom, hogy nem. Pont a fordítottja szokott lenni. Az url-ben jön valami http://akarmi.hu/modulNev/targetNev és ezt akarod úgy átalakítani, hogy létező fájlra mutasson a szerveren. Ezért alakítjuk át http://akarmi.hu/index.php?modul=modulNev&target=targetNev formára, mivel az index.php létezik és ő megoldja az átadott get paraméterek alapján, hogy mit kell csinálnia.
Persze ha te pont a fordítottját akarod, akkor az is működőképes, de az elv az ugyanaz. Kapsz egy url-t ami várhatóan egy nem létező file-ra mutat és ezt átalakíttatod egy olyanra ami létezik.
http nélkül sem történik semmi,
értem a rewrite rule-t és tovabbra is azt akarom, a kapott linket majd php-val szétszedem, de a probléma az h nem valtozik meg az url, tehat uaz marad, van példa ami mukodik, tehat tudom milyen az amikor mukodik, de a fenti példa az istennek nem akar 🙁
mint ahogyan 2007novemberében Álmossal sem jutottatok semmire, lehet h uaz a problema,
RewriteRule (.*)index.php(.*) /$2/ [R]
ilyen tipus átiranyitasok mukodnek, lehet hosszabb is, /jelekkel, stb, de mihelyst ? jel kerül a mintába meghal, nem történik semmi, mindegy h escapelem vagy nem a ?jelet, nem értem,
Köszönöm ezt a részletes cikket! Magyar nyelvű leírást kerestem. Itt mindent megtaláltam amit tudni akartam a mod_rewrite-ról.
Azt hogy szokás megoldani, hogy a linkekben szerepeljenek pl a cikkek nevei is?
Pl. ez helyett:
http://valami.hu/index.php?p=1&p2=45
ez:
http://valami.hu/cikkek/ez-egy-cikk-cime.puding
Ilyen esetben a bejegyzésben találhatóak közül azt az átirányítási szabályt szokták használni ami minden nem létező fájl-ra vonatkozó lekérést átad az index.php-nek. Ezután az index.php-ben feldolgozod az url-t és indítasz egy adatbázis lekérést arra, hogy melyik rekordban található olyan, hogy ez-egy-cikk-cime.puding. Persze ezeknek a stringeknek a legyártásához szükséged lesz egy ékezetlenítő eljárásra. Szerintem nézd meg a wordpress-t, ott is így van megoldva.
De nagy marha vagyok… Végig azon filóztam, hogy ha index.php-ben találom ki, hogy mi a hozzátartozó tartalom és átirányítom oda (header-el), akkor elveszik a szépen formázott link a címsorban…
Viszont nem átirányítani kell, hanem az index.php-nak megjeleníteni az adott tartalmat átirányítás nélkül. A címsorbeli link meg ilyenkor megmarad…
Valószínű azért futottam ilyen csúnyán vakvágányra, mert azzal kezdtem a htaccess átírását, hogy ha nem létezik a link, dobja egy 404-es oldalra… És így az maradt a fejemben, hogy ha nem létezik a link, veszik a címsor… 🙂
Ezer köszönet a cikkért és az útbaigazításért, így már menni fog!
Köszönöm, nagyon sokat segítettél a cikkeddel.
Elöljáróban: végigrágtam magam a cikkeden, nagyon köszönöm! De. Mégsem sikerül megoldanom/működővé tennem az alábbiakat:
http://site.com/showcat.php?cat=11
helyett
http://site.com/alabama
URL-t szeretnék megjeleníteni.
A rovatokon belül a tartalmak URL-jét viszont a címekből generáltatnám, ráadásul eltérő sorrendben. Tehát:
http://site.com/showproduct.php?product=123456&cat=11
helyett
http://site.com/alabama/elado-lakas-123456
Segítséged előre is köszönöm!
@ctrlshift Ha jól értem a különböző kategóriák szöveges verziói jelennek meg az url-ben, majd pedig a termékek. Ilyen esetben azt tudod csinálni, hogy mindne nem létező url-re való hivatkozást (mint pl a http://site.com/alabama/elado-lakas-123456) ráirányítasz az index.php-ra. Ott pedig az url-t feldarabolod a / jelek mentán és php-ből párosítod a megfelelő kategória / termék párossal. Ha így oldod meg akkor már nem rewrite kérdésről hanem php kérdésről van szó, hiszen csak annyit kell tenned, hogy megoldod, hogy a program ne csak GET-ből hanem az url-ből is elfogadjon paramétereket.
A másik módszer, hogy kézzel felveszel egy-egy szabályt a .htaccess fájlodba minden egyes kategóriához. Ez nem is túl elegáns és nem is túl könnyne fenntartható, szóval jobban jársz ha a másik szálon indulsz el inkább.
Ezt a villámgyors reagálást!
Nem voltam elég részletes, tehát:
http://site.com/showcat.php?cat=11
rovat (vagy nevezzük kategóriának) barátságos URL-jét manuálisan szeretném megadni (noha mint írod nem lesz túl elegáns a htaccess fájl…), ami adott esetben több szóból állhat (pl.: http://site.com/alabama-es-kornyeke)
Majd az ezen a kategórián belül található bejegyzéseket már “automatizáltan” a http://site.com/showproduct.php?product=123456&cat=11 URL-ből.
Itt az eredeti
“site/produktum/kategória” sorrenden is változtatni szeretnék
“site/kategória/produktum” mintára.
Lehet, hülyeségeket beszélek: nem vagyok igazán hozzáértő, csak üzemeltetném a készen vásárolt de nem SEO URL-ekkel dolgozó szkriptet.
Ha mod-rewrite segítségével megoldható (még ha nem is a legszebben) kérlek konkrét példával válaszolj (magyarul: mit kellene a htaccess-be másolnom…). Amennyiben nem megoldható, köszönöm az eddigieket!
Nekem kissé fura, hogy a kategóriák másképpen működjenek mint a termékek, de meg lehet éppen csinálni. Valami ilyesmire lesz szükséged:
RewriteRule ^(.*)alabama-es-kornyeke/([^/]+)(/*)$ showproduct.php?cat=11&product=$2 [L]
RewriteRule ^(.*)masikkategoria/([^/]+)(/*)$ showproduct.php?cat=3&product=$2 [L]
RewriteRule ^(.*)akarmikategoria/([^/]+)(/*)$ showproduct.php?cat=42&product=$2 [L]
És annyi ilyen sorra lesz szükséged ahány kategóriád van. Új kategória létrehozásakor azt itt fel kell venni, kategória törlésénél meg jobb ha innen ki van véve.
A product get változódba ilyenkor majd a termék string leírása kerül amit akkor php-ban kicserélsz id-re, vagy hagyod és az alapján keresed ki.
Ma-holnap kipróbálom, nagyon köszönöm a segítséget!
Szia!
Én az alábbiakra nem találtam megoldást.
Az a feladat, hogy a domainom.hu/valami at legyen iranyitva a domainom.hu/valami.php-ra. Tehát hogy kiterjesztés nélkül is elérhetőek legyen az oldalak. Erre az alábbi .htaccess filet irtam:
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ $1.php [L,R,QSA]
Ezzel az a gond, hogyha siman a domain van meghívva (domainom.hu/) akkor is hozzá fűzi a kiterjesztést, de ilyenkor ugy az index.php-t kellene meghivni.
Mivel kellene kiegesziteni a kodot?
A szabályodba nem kell az R flag.
Én a helyedben nem a rewrite-tal oldanám meg a dolgot, mert mi lesz ha valaki meghívja a domainom.hu/nincsilyen-t. Ebben az esetben is problémád lesz. Használd inkább a RewriteRule ^(.*)$ index.php?page=$1 [L,QSA] szabályt és intézd el az átirányítást és hibakezelést az index.php-ból.
Köszi! Jó ötlet 🙂
Üdv!
Szeretnék értesíteni mindenkit, hogy amennyiben annyit szenvedtetek volna azzal, hogy egy szimpla GET kiiratás sem jött össze, mint nekem, akkor nézzétek meg az appache logot.
2 órát szenvedtem amiatt, hogy nem ment, aztán kiszúrta a szemem, hogy a “RewriteBase /” direkt mappaszerkezetre mutatott, így C:\xampp\blabla-val kezdődött a redirect, és ezért nem ment.
Remélem segítettem ezzel is 🙂
Szia!
Egy másik probléma: a következő script simán ment localhoston, xampp alatt:
RewriteEngine on
RewriteBase /fuvaresfoldmunka
RewriteCond %{HTTP_HOST} ^fuvaresfoldmunka\.hu$
RewriteRule ^(.*)$ http://www.fuvaresfoldmunka.hu/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=$1.php [QSA]
Azonban amint feltettem egy éles szerverre, sajnos valami gond lett. Az első része ment, tehát a sima www nélküli kérést átirányította www-sre, tehát maga a htaccess megy, engedélyezve van a mod_rewrite, stb. A base itt már / kell, hogy legyen, ezzel nincs is gond.
Hosszas kisérletezgetés után rájöttem, hogy a RewriteCond %{REQUEST_FILENAME} !-f feltétel nem tetszik neki. (A kezdőoldal bejött, de amikor egy menüpontra kattintottam, pl. http://www.fuvaresfoldmunka.hu/bemutatkozas, akkor simán bejött a bemutatkozas.php tartalma, de nem úgy ahogy kellett volna, tehát nem az index.php a bemutatkozas paraméterrel,hanem mintha direktben hívtam volna.) Ezért a RewriteCond %{REQUEST_FILENAME} !-f részt kivettem, helyette betettem ezeket:
#RewriteCond %{REQUEST_FILENAME} !.css
#RewriteCond %{REQUEST_FILENAME} !.jpg
#RewriteCond %{REQUEST_FILENAME} !.gif
#RewriteCond %{REQUEST_FILENAME} !.png
#RewriteCond %{REQUEST_FILENAME} !.xml
#RewriteCond %{REQUEST_FILENAME} !.txt
#RewriteCond %{REQUEST_FILENAME} !.ico
#RewriteCond %{REQUEST_FILENAME} !index.php
és már ment is. Tehát a probléma megoldódott, de nem elegáns, és nem tudom miért nem megy a sima !-f feltétellel.
Az index.php-ban van amúgy egy switch-case szerkezet, ami kiértékeli a page változót és annak megfelelő php-t include-ol a tartalmi részben. Tehát, ha beütjük, hogy http://www.fuvaresfoldmunka.hu/index.php?page=bemutatkozas.php
Akkor a tartalmi részben a bemutatkozas.php-ban levő tartalom jelenik meg,
a .htaccess -el nyilván a következő formában kerülne meghívásra az URL:
http://www.fuvaresfoldmunka.hu/bemutatkozas
Van valami ötleted esetleg?
Köszönöm:
Ludowico
Hi!
Én vagyok az ember aki a büdös életben nem fogja felfogni a modrewriteot és a regexp-et:D Viszont nagyon kéne hgoy működésre bírjam a Code Ignitert. Elolvastam az összes tutorialt kipróbáltam mindent amit lehetett, és semmi eredmény. Egy rohadt index.php-t kéne kigyilkolni, pedig a CI lehetőséget ad a configjában hogy eltünjön de nincs eredmény:/
Valaki esetleg használta már a CI + modrewritetot úgy hogy működött is? a domain.hu/index.php/anyam/borogass eléggé félmegoldásnak tűnik, és nem értem ha a WP-s kóderek megoldották, akkor az EllisLab-nál miért nem tudják…
igaz már régi :D, de még mindig hasznos leírás
ezer meg ezer köszönet
sokat segített
Nagyon köszönöm. Sokat segítettél.
Megpróbálok megszabadulni a messy urltől a textpattern oldalaimon.
Szia!
a modrewrite-ot használhatom akkor is, ha apache proxy mögött van wordpress-mu, és egy blog-n szeretném, hogy pl.: egy gomb link alatt ne a wordpress-mu belső url-je látszódjon?
Köszönöm az útbaigazítást.
Üdv:
Ádám
Szia !
Nekem egy olyanra lenne szükségem, hogy ha beírom, hogy http://www.oldal.hu/akarmi, akkor a http://www.oldal.hu/akarmi.php jöjjön be..
Van erre megoldás ?
Köszi
Megoldottam.. Köszönöm a leírást.
Csak redirect-el tudtam megoldani.. Esetleg máshogy ?? Ez nem igazán jó így..
@Exalt ez így nem ér 🙂 Legalább azt írd le, hogy mire jutottál. Kódot, kódot!
Szevasz!
Alaposan áttanulmányoztam a cikkedet, és a példákat is, továbbá sikeresen megoldottam a problémámat, de lenne néhány kérdésem, melyekre a választ magamtól nem tudtam kikövetkeztetni.
A feladat végül is nagyon egyszerű, mert egy képgalériához írogattam ilyesmi linkeket:/gallery/elephants/ a kategóriák kiválasztásához, /gallery/elephants/5/ az oldalak váltásához, és /gallery/elephants/baby_645342.png/ a képek közelnézetéhez. A részeket változókba szedem, amelyeket a pretty_url.php dolgoz fel aztán.
Az általam írt MŰKÖDŐ megoldás:
RewriteEngine on
RewriteBase /
RewriteOptions MaxRedirects=10
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/?([^/]+)(.*)/(\w+\.\w+)/?$ pretty_url.php?application=$1&category=$2&file=$3 [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\w+\.\w+/?$
RewriteRule ^/?([^/]+)((/[^/]+)*)/?$ pretty_url.php?application=$1&category=$2 [L]
VISZONT: Kérdezem a következőket:
Miért nem tudom mindezt megoldani a RewriteRuleok szimpla egymás alá írásával?
RewriteRule ^/?([^/]+)(.*)/(\w+\.\w+)/?$ [L]
RewriteRule ^/?([^/]+)((/[^/]+)*)/?$ [L]
Az első csak a fájlnak tűnő végűekre passzol, a második elvileg mindenre.
Az egyiket kikommentelve(#..) a másik mindíg működik, de ha kiíratom a név-érték párokat, akkor ha mindkettő aktív, ezt kapom: application=pretty_url.php, a többi változó meg üres!
Előszörre a specifikusabbra, a fájlra keresek, és ha a minta passzol, akkor az [L] last flagnek meg kellene gátolnia a további szabályok kiértékelését, nem? Ha ez a logika működne, akkor egyszerűen a szabályokat csökkenő specifikusság szerint írhatnám fentről lefelé. Ha ugyan ebben a felállásban kikommentelem a második szabályt, vagy fordítva!, akkor minden rendben!
Próbáltam a skip flaget is az első után [S=1], de ugyan az.
Csak a RewriteCond feltételek ismétlésével tudok egy switch case, case ,case default szerkezethez hasonló dolgot elérni?
@petrob A RewriteCond CSAK a közvetlenül utána következő RewriteRule-ra vonatkozik. Ha egy rule-lal akarod megoldani akkor még a regex-szel kell egy kicsit bíbelődni, vagy mindentől függetlenül a teljes url-t belerakod az application-ba és inkább php oldalon darabolod fel úgy ahogy szeretnéd.
Vagy hagyod így ahogy van mert működik 🙂
Köszönöm a válaszod!
Nagyon jó hogy magyarul is hozzáférhető egy ilyen összefoglaló cikk! A problémákra adott válaszaidból is nagyon sokat lehet okulni.
Üdv,
RewriteEngine on
RewriteOptions MaxRedirects=10
RewriteRule ^(.*)$ index.php?oldal=$1 [QSA,L]
Ezt a kódot beírom .htacces file-ba. Xampp-ot használok, c:\xampp_regi\htdocs\ ezen a helyen van az index.php és a .htacces file.
a php kód:
————
<a href=”konyvek” rel=”nofollow”>Könyvek</a>
————-
Az az elképzelésem, hogy bejön az index.php, rákattintok a “Könyvek” linkre és kiírja, hogy “konyvek” vagy beírom, hogy localhost/konyvek mert végülis ez a lényeg, de mindenhogy 404-es hibát dob. Ez egyenlőre csak próba lenne, de sehogy se akar működni. Nem tudom, hogy valamit elrontottam a .htacces file-ban vagy az apachnál kell-e állítani valamit. A .htacces file-t azzal a windowsos edit-tel írtam.
Előre is köszönöm a segítséget.
@Attila Első körben azt nézd meg, hogy az a .htacces az inkább .htaccess (két s-sel a végén) legyen.
XD XD XD Köszi, sztem nem találtam volna ki, már néztem a log fájlokat is, meg mindent 🙂
Pingback:WebMánia » Egy év egy bejegyzésben 2009