apache“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.

  1. 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
  2. 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):

  1. http://webmania.cc/rovat/17
  2. 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:

URL átírások, Apache mod-rewrite
Cimke:             

226 thoughts on “URL átírások, Apache mod-rewrite

  • 2008. július 19. at 10:50:25
    Permalink

    Í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

    Válasz
  • 2008. július 25. at 15:50:03
    Permalink

    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.

    Válasz
  • 2008. július 25. at 19:36:51
    Permalink

    Johny: Gondolom az url alapján változókat adsz hozzá, szóval a $_GET tömbben ott kell lennie annak amit keresel.

    Válasz
  • 2008. július 28. at 15:05:10
    Permalink

    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

    Válasz
  • 2008. július 30. at 18:34:37
    Permalink

    Csaba: nem tudom olvastad-e a cikket itt egy kicsit feljebb de ott van benne a pontos válasz. Egyszerűsített hostnevek

    Válasz
  • 2008. augusztus 22. at 01:11:58
    Permalink

    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!

    Válasz
  • 2008. augusztus 22. at 07:49:57
    Permalink

    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é?

    Válasz
  • 2008. augusztus 22. at 09:57:07
    Permalink

    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!

    Válasz
  • 2008. augusztus 22. at 13:36:00
    Permalink

    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]

    Válasz
  • 2008. augusztus 22. at 14:07:06
    Permalink

    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!

    Válasz
  • 2008. október 25. at 01:54:40
    Permalink

    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…

    Válasz
  • 2008. október 25. at 12:39:50
    Permalink

    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

    Válasz
  • 2008. október 26. at 00:03:07
    Permalink

    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

    Válasz
  • 2008. október 26. at 09:08:04
    Permalink

    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.

    Válasz
  • 2008. október 27. at 01:30:30
    Permalink

    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.

    Válasz
  • 2008. október 28. at 14:17:51
    Permalink

    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

    Válasz
  • 2009. március 02. at 22:02:12
    Permalink

    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

    Válasz
    • 2009. március 03. at 09:48:47
      Permalink

      @Ludowico nem lenne kézenfekvőbb a webroot könyvtárból egy szintel feljebb másolni az egész cuccodat?

      Válasz
  • 2009. március 03. at 09:56:46
    Permalink

    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.

    Válasz
  • 2009. március 03. at 11:24:03
    Permalink

    Na, már nem is érdekes, mert közben meglett a megoldás:

    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_URI} !^/webroot(.*)
    RewriteRule (.*) /webroot/$1 [L]

    Válasz
  • 2009. március 15. at 21:19:40
    Permalink

    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álasz
  • 2009. április 03. at 12:20:25
    Permalink

    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

    Válasz
    • 2009. április 03. at 14:28:20
      Permalink

      @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

      Válasz
  • 2009. április 07. at 08:57:29
    Permalink

    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.

    Válasz
    • 2009. április 07. at 09:35:09
      Permalink

      @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.

      Válasz
  • 2009. április 08. at 08:50:05
    Permalink

    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,

    Válasz
  • 2009. április 08. at 09:14:33
    Permalink

    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,

    Válasz
  • 2009. április 25. at 14:17:05
    Permalink

    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.

    Válasz
    • 2009. május 16. at 16:30:04
      Permalink

      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.

      Válasz
  • 2009. május 16. at 18:47:22
    Permalink

    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!

    Válasz
  • 2009. május 22. at 20:55:53
    Permalink

    Köszönöm, nagyon sokat segítettél a cikkeddel.

    Válasz
  • 2009. május 28. at 10:32:18
    Permalink

    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!

    Válasz
    • 2009. május 28. at 10:43:50
      Permalink

      @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.

      Válasz
  • 2009. május 28. at 10:59:04
    Permalink

    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!

    Válasz
    • 2009. május 28. at 11:16:15
      Permalink

      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.

      Válasz
  • 2009. május 28. at 11:47:12
    Permalink

    Ma-holnap kipróbálom, nagyon köszönöm a segítséget!

    Válasz
  • 2009. június 15. at 23:16:15
    Permalink

    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?

    Válasz
    • 2009. június 18. at 11:48:20
      Permalink

      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.

      Válasz
  • 2009. július 01. at 18:16:55
    Permalink

    Ü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 🙂

    Válasz
  • 2009. július 27. at 10:32:23
    Permalink

    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

    Válasz
  • 2009. augusztus 11. at 23:16:28
    Permalink

    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…

    Válasz
  • 2009. augusztus 29. at 11:12:32
    Permalink

    igaz már régi :D, de még mindig hasznos leírás
    ezer meg ezer köszönet
    sokat segített

    Válasz
  • 2009. október 29. at 11:45:08
    Permalink

    Nagyon köszönöm. Sokat segítettél.
    Megpróbálok megszabadulni a messy urltől a textpattern oldalaimon.

    Válasz
  • 2009. november 12. at 12:24:47
    Permalink

    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

    Válasz
  • 2009. november 24. at 23:42:56
    Permalink

    Megoldottam.. Köszönöm a leírást.

    Válasz
  • 2009. november 24. at 23:52:04
    Permalink

    Csak redirect-el tudtam megoldani.. Esetleg máshogy ?? Ez nem igazán jó így..

    Válasz
    • 2009. november 25. at 11:33:29
      Permalink

      @Exalt ez így nem ér 🙂 Legalább azt írd le, hogy mire jutottál. Kódot, kódot!

      Válasz
  • 2009. november 27. at 20:18:49
    Permalink

    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?

    Válasz
    • 2009. november 27. at 20:26:12
      Permalink

      @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 🙂

      Válasz
  • 2009. november 28. at 17:45:38
    Permalink

    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.

    Válasz
  • 2009. december 15. at 15:10:56
    Permalink

    Ü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.

    Válasz
    • 2009. december 15. at 16:36:11
      Permalink

      @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.

      Válasz
  • 2009. december 15. at 17:34:34
    Permalink

    XD XD XD Köszi, sztem nem találtam volna ki, már néztem a log fájlokat is, meg mindent 🙂

    Válasz
  • Pingback:WebMánia » Egy év egy bejegyzésben 2009

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük