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

, , ,

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.


RewriteEngine on
RewriteOptions MaxRedirects=10

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.


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]

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:

  • Share/Bookmark
Mi az az RSS és mi az a PayPal?

Ez a bejegyzés rrd billentyűzetéből potyogott ki 2006 augusztus 21. napján 09:40:01-kor. Eddig 19,510 olvasást ért meg. A visszajelzéseket nyomonkövetheted ezzel az RSS feed-el. Véleményt nyilváníthatsz, vagy trackbackolhatsz a saját oldaladon.

Ugrás fel

JólMegMondjad!

187 vélemény

  1. morfio
    2007 június 3. 11:14:43

    Szia!
    Én ezt szeretném vhogy megváétoztatni:
    http://oldal.hu/index.php?oldal=valami

    erre:

    http://oldal.hu/valami

    Van megoldás?

  2. rrd
    2007 június 3. 11:29:38

    morfio: Van bizony, és ha elolvasnád a cikket akkor rá is jönnél, mert minimum 3 helyen szerepel benne. :P

    RewriteRule ^(.*)$ index.php?oldal=$1 [QSA,L]

  3. morfio
    2007 június 3. 11:35:39

    Ez így jó, ha az alkönyvtár /proba:

    RewriteEngine on
    RewriteOptions MaxRedirects=10

    #Ebben az alkonyvtarban vagyunk, ezt figyelembe kell venni
    RewriteBase /proba

    RewriteRule ^(.*)$ index.php?oldal=$1 [QSA,L]

  4. rrd
    2007 június 4. 06:27:33

    morfio: Kérdezed vagy mondod?
    Elvileg jó, de ki kell próbálni, mert adódhatnak a base miatt érdekességek.

  5. morfio
    2007 június 4. 09:46:06

    kérdezem… hehe, megy így, legalábbis a linkelés, de a css-t nem jeleníti meg, s ha beírom a böngészőbe az url-t, akkor nem jeleníthető meg… mi a gond?

  6. rrd
    2007 június 5. 01:11:28

    morfio: hát így látatlanban nehéz megmondani. Ha adsz egy linket amit látok, akkor ránézek. De tippem az van :) . A fenti átirányítás abszolút, azaz mindent átirányít. Vagyis ha az oldalad megpróbálja lehívni a http://oldal.hu/style.css filet, akkor azon is végrehajtódik az átirányítás, és ezért a http://oldal.hu/index.php?oldal=style.css -t próbálja megjeleníteni. Ugyanez lesz a helyzet a képekkel, javascript fileokkal, és minden egyébbel amit próbálsz vele megjeleníteni. Ennek kezelését megtalálod fentebb a “ha nincs favicon” kezdetű példában.

  7. morfio
    2007 június 9. 07:52:47

    SIKERÜLT!!!!!!! :) elolvastam a cikket, és egyből tudtam, s műkösik!!!! jee :D

  8. arti
    2007 június 19. 22:00:48

    Hali,

    remelem tudtok nekem segiteni :)
    az en atirando linkem #-t tartalmaz… azt hogyan irhatnam at rewriterule-al?
    pl: http://www.akarmi.hu/olvasdel#harmadikfejezet

    elore is koszi

  9. rrd
    2007 június 20. 09:04:31

    arti: Mi nem ment? Mit próbáltál? A mintába beteszed a #-t és kész.

  10. arti
    2007 június 20. 09:49:20

    irnam a parancsot pl

    rewriterule /olvasdel/harmadik /olvasdel#harmadikfejezet

    de a #-t specialis karakternek veszi, az utana levo dolgokat nem veszi figyelembe…
    csak a http://www.akarmi.hu/olvasdel/ -re ugrik

  11. rrd
    2007 június 20. 15:33:26

    arti: Igen, tényleg a mod_rewirte escapeli a # jelet %23-ra. Ezért a RewriteRule-nál a [NE] flaget kell beállítani az escape elkerülése érdekében. Én még nem csináltam ilyet, próbáld ki, de lehet, hogy kell vele kicsit játszogatni.

  12. Csaba
    2007 július 22. 11:24:26

    Szia!
    Klassz cikk, egy kis szépséghibával meg is oldottam a dolgokat.
    http://www.szivkuldi.hu/kepeslap/gallerybrowser.php?cat_id=11

    url a

    http://www.szivkuldi.hu/kepeslap/technika/

    url-t meghívva is szépen betölt, de a css fájlokkal valami gond lehet.
    Mit ronthattam el, ha a .htaccess fájlom a következőket tartalmazza:
    RewriteEngine on
    RewriteOptions MaxRedirects=10
    RewriteBase /kepeslap
    RewriteCond %{SERVER_NAME} szivkuldi.hu
    RewriteRule ^(.*)technika(.*)$ gallerybrowser.php?cat_id=11 [QSA,L]
    RewriteCond %{REQUEST_FILENAME} !favicon.ico [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?hack=$1 [QSA]

    Köszi!

  13. rrd
    2007 július 23. 06:55:37

    Csaba: A definíciód azt mondja, hogy minden url-t amiben szerepel a technika szó az legyen átirányítva a gallerybrowser.php?cat_id=11 url-re. Szóval a http://szivkuldi.hu/kepeslap/technika/stiluslap.css is át lesz irányítva rá.

    Vagy átírod az átirányítást, vagy gondoskodsz róla, hogy a php fileod kiszolgálja a css-t, vagy a css fileodat egy könyvtárral feljebb rakod.

  14. morfio
    2007 augusztus 2. 02:50:58

    hello.
    lenne egy kérdésem. van egy ilyen urlem:
    http://www.valami.hu/index.php?page=introducing&title=introducing&option=quick-chocie
    ezt, hogy tudom ilyenre csinálni:
    http://www.valami.hu/introducing
    köszi előre is.

  15. rrd
    2007 augusztus 2. 21:38:19

    morfio: beugratós kérdésekre nem válaszolok :) Mit próbáltál? Mi nem ment? Az elv ugyanaz mint amire írtad, hogy sikerült.

  16. Csaby
    2007 augusztus 8. 13:43:02

    Szia!

    Kérdésem a következő csak sejtem mi lehet a gond de a:
    RewriteEngine on-ra 500 as hibat dob a localhostom a mi egy appserv konstukció 2.2 apache-al meg 5.2.1 php van benne mi lehet a gond? néztem a betöltödö modulokat a szerveren nem szerepel köztük a mod_rewrite de a fájl .so kiterjesztéssel meg van?!

    tud valaki ebben segíteni?
    előre is köszönöm!

  17. Csaby
    2007 augusztus 8. 19:07:25

    Sziasztok!

    az elöbb feltett kérdésem megoldodott!
    de van egy újabb mégpedig az hogy

    ….hu/index.php?oldal=valami&param1=1&param2=2&…
    ebből hogy lehet
    ….hu/valami/valami.html

  18. rrd
    2007 augusztus 9. 09:25:31

    Csaby: Attól függ, hogy mit is szeretnél. A paraméterektől függő vagy független átirányítást. De minden le van írva általánosságban odafenn. Ha valami nem tiszta akkor meg konkrétan kérdezz

  19. Csaby
    2007 augusztus 10. 12:40:33

    Szia!

    Konkrétan az lenne hogy van egy ilyen href:
    <a href=”index.php?oid=oldal&keres=ezt&info=ez” rel=”nofollow”>néz</a>
    és erre kattintva valami hasonló jelenjen meg a böngészőben:
    ..hu/oldal/ezt/info
    viszont az a link dolgozza fel ami href-ben van
    és ha
    ..hu/oldal/ezt/info vagy
    ..hu/index.php?oid=oldal&keres=ezt&info=ez
    van beleírva a böngészöbe akkor is ugyan az hajtodjon végre (ez meg van)

    igen olvastam az egész oldalt sőt még több helyen is utána néztem de sehol nem találtam olyat hogy a href ilyen formában működne.

  20. rrd
    2007 augusztus 10. 14:24:58

    Csaby: Ha jól értem a perjelek mentén akarod szétdarabolni az url-t.

    RewriteRule akarmi.hu/(.*)/(.*)/(.*) index.php?oid=$1&keres=$2&info=$3 [QSA,L]

    Nem próbáltam ki, de valami ilyesmi :)

  21. amnS
    2007 augusztus 10. 16:20:54

    üdv
    a cikk tetszik, habár így elsőre nem sikerült mindent felfogni, na de bennem van a hiba…
    valamit mégis csak összetákoltam, és akadna egy problémám.
    mégpedig:
    az ékezetekkel lenne gondom, de csak firefoxban, mert ugye az átalakítja őket %xx formára, és így nem megy, kivéve az ő és ű működik (nem értem miért ezek), még akkor is, ha a többi ékezetes és egy ezek közül van benne.

    szóval részletesebben:
    ez a rule-om:

    RewriteCond %{REQUEST_FILENAME} !-f [NC]
    RewriteCond %{REQUEST_FILENAME} !-d [NC]
    RewriteRule ^(.*)$ index.php?x=$1 [QSA,L]

    ez ugye annyit csinál, hogy ha nem file vagy mappa, akkor ami a címben van átdobja egy x nevű get változóba, és onnan phpben azt csinálok vele, amit jól esik. pl.:
    http://localhost/user – ez egy modulom, tökéletesen működik
    http://localhost/none – no, ilyen modulom nincs, és szépen ki is írja, hogy nincs, szóval ezzel sincs gond
    http://localhost/őű – nemlétező modul, de ez a kettő jól is működik
    http://localhost/áéáé – ilyen modulom sincs, de ezzel nem azt írja ki, hogy nincs, hanem mappaként fogja fel, és ad egy “Forbidden” hibát.
    http://localhost/éő – ha így írom, akkor működik, ha:
    http://localhost/%C3ő vagy é%C5%91 – ekkor már nem, meg nem tudom ezt miért így kódolja, hogy %xx%xx, meg még egy van pár féle változat, de nem akarom terhelni az adatbázist…

    szóval a kérdésem: hogyan tudom ezt a hibát kiküszöbölni?

  22. rrd
    2007 augusztus 11. 07:43:10

    amnS: A magam részéről nem tudom, nem néztem soha ékezetes betűkre.

  23. amnS
    2007 augusztus 14. 21:01:05

    no sebaj. megoldottam phpben egy urldecode-dal, plusz a linkeket urlencode-dal íratom ki, és így minden tökéletesen működik…
    üdv!

  24. hubbabubba
    2007 szeptember 29. 18:26:24

    nagyon frankó leírás!
    össze is tudtam kalapálni egy kódot ami a domain.hu/oldal/id-t átkonvertálja domain.hu/index.php?oldal=oldal&id=id-re

    viszont

    css-sel gondjaim vannak..

    RewriteCond %{REQUEST_FILENAME} !.css
    vagy
    RewriteCond %{REQUEST_FILENAME} !(.*)css(.*)
    vagy
    RewriteCond %{REQUEST_FILENAME} !(.*)style.css

    ezeket ha beteszem ez elé:
    RewriteRule ^([a-zA-Z0-9]+)/?([0-9]*)/?$ index.php?oldal=$1&id=$2 [QSA,L]

    akkor a domain.hu/valami oldal (ami ugye domain.hu?oldal=valami) frankón bejön és a css is, szóval ezzel nincs gond.
    viszont ha a domain.hu/valami/1-et nézem, akkor bejön a domain.hu?oldal=valami&id=1 de a css ebben az esetben nem!

    mi lehet a gond?

  25. rrd
    2007 szeptember 30. 14:21:22

    hubbabubba: Attól függ, hogy hogyan hívod a html-ből a css fileodat. Másrészről viszont a /?$ azt mondja, hogy a kifejezés végén legalább egy / jelnek kell lennie. A domain.hu/valami/1 végén meg nincsen.

  26. hubbabubba
    2007 október 3. 16:00:48

    rrd: kösz a választ!

    (a ? nem 0-át vagy 1-et jelent?)

    átírtam és most ilyen lett:

    RewriteCond %{REQUEST_FILENAME} !(\.css|\.jpg)
    RewriteRule .* index.php [L]

    a domain.hu/valami szépen bejön, css-el + jpg képpel együtt. egészen addig, amíg a “valami”ben nem szerepel egy / jel. ha van benne / akkor is betölti magát az oldalt (index.php-t) de css és jpg képek nélkül.

    help!

  27. rrd
    2007 október 4. 15:07:24

    hubbabubba: a problémádat úgy hívják, hogy trailing slash, keress rá, fogsz találni sok leírást. Másrészről viszont az ezzel való bűvészkedés helyett a magam részéről azt tanácsolnám, hogy használd a minta .htaccess file (#ha nincs favicon sortól kezdve) utolsó sorait, és utánna bízd rá a szerver oldali programra a paraméterek feldolgozását (ott a hack változóba kerül, de lehet éppen oldal is).

    Ez hordozhatóbbá és biztosabbá teszi a programot.

  28. kola
    2007 október 12. 07:04:14

    Sziasztok!

    Szeretnék egy ilyet csinálni:
    valami.hu
    valami.hu/alma
    valami.hu/korte stb.

    tehát egy olyan megoldás érdekelne, ami “szétdobja” a lapokat (az alma, korte mappákban lenne az index.php)

    eddig alma.valami.hu és korte.valami.hu volt aldomainként, de lehet kénytelen leszek az aldomaineket megszüntetni, ezért érdekel erre működő, jó megoldás

    előre is THX

  29. rrd
    2007 október 12. 07:09:04

    kola: nem igazán értem a problémádat. Csinálasz egy korte alkönyvtárat és hari.

  30. kola
    2007 október 12. 09:40:13

    valami.hu-ban van egy .htaccess

    RewriteEngine on
    RewriteBase /

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule ^(.*)$ /index.php?page=$1 [QSA]

    ba beírom: valami.hu/alma ez még jó is
    de ha tovább írom: valami.hu/alma/piros ez már nem létezik, tehát a rövid URL-t akarom használni majd az alma, korte mappákban is

  31. rrd
    2007 október 13. 02:11:44

    kola: legegyszerűbben úgy tudod kezelni ha az alkönyvtárakba beteszel egy egy külön .htaccess filet.

  32. kola
    2007 október 13. 14:31:09

    értem, és az hogy nézzen ki?
    mit alakítsak a fenti htaccess-emen?
    vagy új, másféle lenne célravezető?

  33. kola
    2007 október 14. 09:38:40

    közben azt hiszem rájöttem, én voltam figyelmetlen
    miután ezt használjuk:

    $URI = (isset($_SERVER['REQUEST_URI']) ? substr($_SERVER['REQUEST_URI'], 1) : ”);
    $oldal = $URI;

    kell még egy ilyen:

    $oldal = str_replace(“mappaneve/”, “”, $oldal);

    ja, és a kt-ban a .htaccess-ben RewriteBase /mappaneve

    bocs az értetlenkedésért, nem volt szándékos

  34. sajtos
    2007 október 26. 11:37:19

    hello-hallo,

    frankón nyit, viszont ha / van a vegen, akkor a kepeket mar a domain.hu/media/ dirbe keresi… ami nekem nem jo, mert ott nincs.
    base-el kellene valamit manipulalnom?

    RewriteEngine on
    RewriteOptions MaxRedirects=10
    RewriteBase /
    RewriteRule ^(.*)media(/*)$ index.fcgi?cat=media [L]

    koszi!

    udv:
    sajt

  35. rrd
    2007 október 27. 05:18:31

    sajtos: nem a base a probléma. Ebből a részből nem látszik, de vagy neked is a trailing slash-re kell keresgetned, vagy hiányzik az a sor ami megmondja neki, hogy ha létező filet kérsz le akkor szolgálja ki.

  36. sajtos
    2007 október 27. 05:49:24

    rrd: koszi, megprobalkozom vele! ;)

  37. almos
    2007 november 6. 07:59:07

    Hello!
    Egyszerusitett url t szeretnek visszakapni az alabbi linkbol.
    index.php?modul=home&target=ter

    /home/ter/ -t szeretnek visszakapni, de valamiert nem akar osszejonni. :(

    A CSS es kepek eltunese nalam is elojott, de egy base href= a headerbe megoldotta a problemat, de ez nem igazan nyerte el a tetszesemet. A favicon utanni reszt probaltam, de nem mukodott. Van esetleg egyebb javaslat?
    minden amit nem akarnek cserelni skins/ konyvtarban van

    Elore is koszi

  38. rrd
    2007 november 6. 19:06:59

    almos: Ha esetleg betennéd, hogy mit próbáltál (mármint az összes utasítást) akkor megnézem mit lehet rajta módosítani. De senki helyett nem oldom meg a problémáját :) Azért van a cikk, hogy az alapján megoldjátok magatok :P

  39. almos
    2007 november 6. 19:11:37

    Igazabol ha jol ertelmeztem a reg exp kifejezest index.php?module na itt a kerdojelnel van gond, most mar nem tudom melyik a veglege, mert annyiszor atirtam mar :)

    RewriteEngine on
    RewriteOptions MaxRedirects=10

    RewriteRule ^(.*)(index[.]php[?]module[=]){1}(.*)[&](target[=])(.*)$ /home/$3/$5/ [QSA,R,L]

    de ez szerintem most nem is mukodik. :(

  40. rrd
    2007 november 6. 19:34:22

    almos: Egyrészt a ? az egy reguláris illesztő kifejezés, szóval ha magát a ?-et akarod keresni akkor escapelni kell \?. Ugyanez a helyzet a ponttal.
    Másrészt ha hiányzik a ha nincs favicon, fa nem létezik a file és a ha nem létezik a könyvtár kezdetű feltétel akkor nem kell csodálkozni, hogy a css elveszik.
    Harmadrészt a reguláris kifejezésed teljesen rossz. Kicsit annak kéne utánnaolvasnod, hogy hogyan működik a regexp. Hamarosan felrakok ide egy kis scriptet amivel tudsz illeszkedésvizsgálatot végezni, az segít lecsekkolni, hogy jó-e a regexp vagy nem.

  41. almos
    2007 november 6. 19:54:07

    A CSS eltunest most nem raktam be ,de arra hasznalom a
    RewriteCond %{REQUEST_FILENAME} !favicon.ico [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    szabalyokat. ha kiveszem a html header bol a base href direktivat akkor viszont nem megy.

    Ez a regexp lehet, h nem jo, csak hirtelen kimasoltam valamit, de egyebkent en is hasznalok ilyen regexp checket, es ott lattam, h a megfelelo substringekre darabolja, de valahogy .htaccess ben nem mukodott.

    http://www.quanetic.com/regex.php itt neztem a kifejezest, ereg modban es ott mukodik a
    index.php?module=home&target=ter
    linkre. :( eh, nem ertem

  42. rrd
    2007 november 6. 20:31:43

    almos: Itt tesztelheted

    Most megint a szabályaid felét tetted ide be. Szívesen segítek, de nem fogok találgatni ha nem teszed be a teljes szabály listádat.

    Ha a mintád jónak bizonyul és mégsem működik a rövid cím akkor meg meg kell nézni, hogy az apache biztosan kezeli-e a rewrite-ot. Ezt legegyszerűbben úgy tudod megtenni ha a .htaccess fileodba betezsel valami nem odaillő utasítást, (pl Mond, hogy GÓRANGA!) és ha hibát dob akkor már tudod, hogy figyelembe veszi a helyi .htaccess fileokat.

  43. almos
    2007 november 6. 21:58:49

    Eloszor is nagyon koszi a linket. :)

    RewriteEngine on
    RewriteOptions MaxRedirects=10

    RewriteRule (.*)index.php\?module=(.*)&target=(.*) /vanq/$1/$2/ [R]

    RewriteCond %{REQUEST_FILENAME} !favicon.ico [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule ^([a-zA-Z0-9]+)/?([a-zA-Z0-9]*)/?$ index.php?module=$1&target=$2 [QSA,L]

    A rovid url gyartas tovabbra se vezet eredmenyre, pedig a teszt oldalad is azt mondja, hogy illeszkedik a mintara.
    ellenben ha a rulet lecserelem az alabbira:
    RewriteRule (.*)index.php(.*) /vanq/$1/ [QSA,R]
    (tehat a kerdojelig vagom) akkor mar elkezdi darabolni
    es uj urlt gyart.

    Masik iranyba jol mukodik, leszamitva a CSS -est.

  44. rrd
    2007 november 6. 22:05:41

    almos: az R flag nem kéne az lesz a baja. R flaggel kizárólag létező URL-re lehet átirányítani. Hagyd le és jó lesz. (legalábbis remélem :) )

  45. almos
    2007 november 6. 22:11:14

    Hat nem nyert . :(

    Ellenben kivettem a rulebol a ? jelet
    RewriteRule (.*)index.phpmodule=(.*)&target=(.*) vanq/$2/$3/ [R]

    es beadtam neki linkbe a
    index.phpmodul=home&target=ter

    akkor szepen megcsinalta /home/ter/ -t :S

  46. rrd
    2007 november 6. 22:40:28

    almos: escapeld a ?-t. Most látom, hogy amit beírtál csak az egyik helyen van escapelve.

  47. almos
    2007 november 6. 23:15:06

    aha persze, de megprobaltam mar anelkul is.

  48. regthings
    2007 november 22. 09:34:32

    szia

    Csinaltam egy ilyet:

    RewriteCond %{THE_REQUEST} ^(.*)comm=10$
    RewriteRule ^(.*)$ http://localhost/akarmi/logout

    de nekem a bongeszobe a kovetkezo url jon letre, mikor egy olyan linkre kattintok amiben van comm=10:
    http://localhost/akarmi/logout?comm=10

    ez viszont nem jo nekem, csak igy kene letrejojjon:
    http://localhost/akarmi/logout
    valahogy a %{THE_REQUEST} -et nullazni kene vagy nem tudom…

  49. tanar
    2007 november 26. 09:52:02

    Hi

    Tud valaki megoldást arra, hogy a http://www.domainom.hu át van irányítva php header()-el a http://www.masikdomain.hu/domainom-ra. Ennek technikai okai vannak (másik szerver).
    De én azt szeretném, hogy a http://www.domainom.hu látszon az url-ben, és alatta a http://www.masikdomain.hu/domainom adja vissza a tartalmat. Azt gondoltam, hogy URL rewrite-at meg lehet oldani a kérdést. Viszont nem jövök rá a megoldásra, hiába szenvedek vele.
    Szerintetek lehet ilyet egyáltalán?

  50. rrd
    2007 november 26. 17:19:27

    tanar: ha ezt meg lehetne csinálni, akkor gyorsan csinálnék egy rakás banki belépő oldalra hasonlító oldalt ami az én szerveremen menne, de az url-ben az ő címük jelenne meg. A felhasználók meg szépen megadnák a jelszavukat én meg elkezdenék sokat sokat utalni a saját számlámra az övékről… :)

    Szóval ez nem fog menni. De miért nem csináltatod meg a nameszerver szolgáltatónál az átirányítást?

  51. rrd
    2007 november 26. 17:24:34

    regthings: Szerintem nem kell neked a rewritecond.

    RewriteRule ^(.*)comm=10$ http://localhost/akarmi/logout [L]

  52. tanar
    2007 november 26. 17:45:58

    rrd: Akkor fogj egy üres oldalt, hozz létre benne egy frame-t, és írd bele tartalmának a banknak a webcímét. Sokat nem értél el vele, hiszen a bank webcíme továbbra is oda mutat, mint eddig. Ebből te nem leszel milliomos, viszont az én problémámra ez a megoldás jó lenne (ezért is gondoltam, hogy meg lehet oldani rewrite-al), csak szeretnék valami szebb megoldást.
    Egyéb ötlet vki?

  53. rrd
    2007 november 26. 18:00:29

    tanar: lényeg, hogy amit te akarsz az komoly biztonsági problémát jelentene. Rewritetal nem fog menni. MArad a nameszerver átállítás.

  54. Tobias
    2007 november 27. 19:52:11

    Sziasztok!

    Egy php keretrendszeren dolgozok, amiben elég fontos lenne az átirányítás.
    Úgy szeretném megoldani .htaccess fájlban, hogy átirányítson minden létező és nem létező url-t, abban a könyvtárban lévő index.php-re, amelyben a .htaccess fájl is van. Mindezt úgy, hogy lényegtelen legyen, hogy a DOCUMENT_ROOT-ban van-e vagy az alatta lévő könyvtárak valamelyikébe.

    Most ott tartok, hogy sajnos meg kell adnom, hogy a DOCUMENT_ROOT -alatt melyik könyvtárban van, mert különben, ha az böngésző címsorába bármilyen urlt adok meg aminek a vége index.php akkor ha létezik azt futtatja le.

    RewriteEngine on
    RewriteOptions MaxRedirects=10

    #RewriteBase /

    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^(.+[^/])$ $1/ [L]

    #RewriteCond %{REQUEST_FILENAME} !%{DOCUMENT_ROOT}/moocowfw/index.php
    RewriteCond %{REQUEST_FILENAME} !index.php
    RewriteRule ^(.*)(/*)$ index.php?module=$1 [L,QSA]

  55. Tobias
    2007 november 27. 19:53:02

    Lemaradt:
    RewriteEngine on
    RewriteOptions MaxRedirects=10

    #RewriteBase /

    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^(.+[^/])$ $1/ [L]

    #RewriteCond %{REQUEST_FILENAME} !%{DOCUMENT_ROOT}/moocowfw/index.php
    RewriteCond %{REQUEST_FILENAME} !index.php
    RewriteRule ^(.*)(/*)$ index.php?module=$1 [L,QSA]

  56. rrd
    2007 november 28. 09:52:49

    Tobias: Ezt úgy tudod megoldani, hogy minden alkönyvtárban lévő .htaccess fileban megadod a RewriteBase direktívát. Egyébként a cakePHP keretrendszer pont így kezeli az átirányításokat mint ahogy te szeretnéd. Töltsd le, és nézz bele a /.htaccess, a /app/.htaccess és a /app/webroot/.htaccess fileokba. Szerintem könnyen rájössz ebből a megoldásra.

  57. Tobias
    2007 november 28. 11:52:21

    rrd: Ha beálítom a RewriteBase-t akkor nem jelennek meg a képek amit egyébként az index.php-ben base64 kódolással tárolok. Tehát csak akkor megy, ha nincs RewriteBase-t megadva.

    Közben erősen próbálkoztam és most úgy tűnik hogy úgy megy, ha leveszem a vizsgálatot teljesen az index.php-ről.
    Azt hittem, ha nincs index.php vizsgálat akkor túlhajtja az átirányítást és nem tölti be az oldalt. Még tesztelem de most perpill így megy:

    RewriteEngine on
    RewriteOptions MaxRedirects=10

    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^(.+[^/])$ $1/ [L]

    RewriteRule ^(.*)(/*)$ index.php?module=$1 [L,QSA]

  58. tone
    2008 március 7. 02:46:17

    hello

    egy egyszerű rewriteot szeretnék csinálni (legalábbis annk tűnt):
    1. http://www.valami?page=nyitooldal => http://www.valmi/nyitooldal
    ezzel nem volt gond, hiszen szerepel itt is jópárszor, múködik is

    2. http://www.valami?lang=hu => http://www.valami/hu
    ez sem volt gond, ez is szerepelt már, asszem, ez is megy

    3. http://www.valami?page=nyitooldal&lang=hu => http://www.valami/nyitooldal/hu

    na ezt már nem vette be…

    4. ha bármi más jön, ami nem file v dir, akkor meg http://www.valami

    ez van a .htaccess-ben (nem vagyok biztos, hogy kell-e a sok RewriteCond, de ha elhagytam, akkor még annyira sem ment, mint most):

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/(hu|en)$ index.php?page=$1&language=$2

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(hu|en)$ index.php?language=$1

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?page=$1

    és még egy dolog, az utolsó rule hivatott a hibás url lekezelésére (a $page változót php-ben vizsgálom) pl: http://www.valmi/nincs_ilyen_oldal -lal működik is, de ha http://www.valmi/nincs/ilyen/oldal van, akkor megint nem jó, a hiba pedig az, hogy nincs css és nincsenek képek az oldalon;

    ha van valkinek ötlet, akkor örülnék, ha megosztaná;

    üdv
    tone

  59. rrd
    2008 március 7. 09:47:42

    tone: Az utasítások soronként értékelődnek ki, tehát a !-f és a !-d utasítás elég egyszer a végén a page-es utasítás előtt.

    RewriteRule ^(hu|en)$ index.php?language=$1
    Ennek így semmi értelme. A zárójelekben lévő rész sosem fog illeszkedni egy url-re.

    RewriteRule ^(.*)/(.*)/(.*)$ index.php?page=$2&languauge=$3
    Ha jól értem valami ilyesmi kellen neked.

    Nem próbáltam ki, de érdemes lenne ezzel próbálkozni.

    De ha már egyszer hozzáférsz a phphoz, akkor felesleges a rewriteruleokat bonyolítgani. Használd egyszerűen a
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?page=$1
    utasításokat és minden egyéb varázslatot meg csinálj meg php-ból.

  60. tone
    2008 március 7. 15:46:40

    hello,

    megfogadtam, a tanácsod, és sikerült elérni, amit szerettem volna, de örömöm mégsem felhőtlen;

    most ezt használom:
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?page=$1

    és ahogy mondtad a többit a php csinálja…
    az oldal és nyelv változokat szétválasztom, aprobléma pedig megint a képekkel (és egyéb relativ hivatkozásokkal van)

    tehát a http://www.valami/nyitooldal/hu esetén az oldal jó, a nyelv jó, és a többi nem; mert ugye a képet így keresi ekkor: http://www.valami/nyitooldal/images/kep.gif, ami ugye nincs;

    ezt jelenleg úgy korigálom, hogy a relativ hivatkozások elé beszúrok egy ‘http://’.$_SERVER['SERVER_NAME'].’/’ tartalmú változót;

    ám a célom az volna, hogy ne keljen ezt a változót használni sehol, hanem egy rule intézze mindezt;

    ezt találtam ki (persze nem azt teszi amit szeretnék):

    RewriteRule ^(.*)(/[^/]*\.(jpg|png|gif|css|js|swf))$ /$2

    tudom itt már a reg exp tudásom (is) sántít, de ez járható út? vagy felejtsem el inkább?

  61. rrd
    2008 március 7. 15:58:17

    tone: A legegyszerűbb egy base tag használata a html oldal fejlécében

    <base href=”http://akarmi.hu” />

    Ezzel minden relatív hivatkozásod ehhez a domainhez képest kerül kiértékelésre.

    Ha rewrite-tal akarod, akkor meg az első zárójelet bontsd meg az első / jelnél. Valami ilyesmi:

    RewriteRule ^([^/]+)/(.*)$ index.php?page=$2

  62. GeBA
    2008 április 24. 16:22:52

    Szia!

    Nagyon örültem ennek a jól összeszedett írásnak, de a gyakorlati megvalósításnál én is elakadtam valamin. A problémám a következő…

    Az oldal egyelőre a saját gépemen fut. Az index.php egy tesztmappa nevű könyvtárban található (a base tag-et ennek megfelelően állítottam be, és így a relatív hivatkozások rendesen működnek is). A “tesztmappa/interjuk” cím behozza a kívánt oldalt, az alábbi szabálynak köszönhetően:
    RewriteRule ^interjuk(/?)$ index.php?pg=interjuk [L]

    Ám ha a “tesztmappa/interjuk/1″ címen szeretném elérni az egyik interjút, azzal már gondok vannak. A szabály:
    RewriteRule ^interjuk/([1234567890]+)(/?)$ index.php?pg=interju&id=$2 [L]

    A probléma az, hogy a rendszer a nem létező “interjuk” mappában keresi az index.php fájlt: “http://localhost/tesztmappa/interjuk/index.php”

    És mindez független attól, hogy beállítom-e a RewriteBase-t. (RewriteBase /tesztmappa)

    Hol lehet a hiba?

  63. rrd
    2008 április 24. 16:37:26

    GeBa: Egy hirtelen ötlet: RewriteRule interjuk/(\d+)(/?)$ /index.php?pg=interju&id=$2 [L]

    Szerintem az interjuk elé nem kell a ^ jel, a számok helyett használhatod a \d-t és az index.php elé kell egy /.

  64. GeBA
    2008 április 24. 17:12:09

    Az a baj, hogy így meg a localhost gyökerében keresi az index.php-t, holott az a localhost/tesztmappa könyvtárban van. Pedig a RewriteBase be van állítva (da ha kiveszem, akkor sem jobb).
    Megpróbáltam azt is, hogy az index.php elé nem csak egy “/” jelet írok, hanem ezt: “/tesztmappa/”, de akkor meg megint azt hiszi, hogy egy interjuk mappában kell keresnie az index.php-t. :(

  65. rrd
    2008 április 24. 17:23:13

    GeBA: akkor másold be lécci ide a teljes .htacces fileod tartalmát és megnézem.

  66. GeBA
    2008 április 24. 17:51:02

    Ó, sokkal egyszerűbb volt a hiba, mint gondoltam! $2 helyett $1-et kellett volna írnom a szabály végére. Most működik. :) Köszönöm!

  67. Lali
    2008 április 29. 00:30:42

    Hello!

    Lehetséges-e olyan rewrite rule-t írni ami az index.php-t ne jelenítse meg? Tehát ha beírom a böngészőbe hogy http://www.domain.com akkor maradjon ez a cím, és ne alakítsa át http://www.domain.com/index.php alakra (mert megtalálta az indexet). Vagy ha nem oldható meg rewrite rule-al, akkor hogyan?

  68. rrd
    2008 április 29. 09:07:18

    Lali: Ez nem rewrite kérdés, hanem webszerver beállítás. Apache finomságokban nem vagyok otthon.

  69. Csaba
    2008 május 16. 13:23:04

    Szia!

    Kellene egy kis segítség, mert nem igazán akar összejönni ez az url rövidítés. Pedig szerintem minden jó, vagy mégse.

    A .htaccess filém:

    RewriteEngine on
    RewriteOptions MaxRedirects=10
    RewriteRule ^(.*)valami/(.*)$ index.php?oldal=$2 [NC]

    RewriteCond %{REQUEST_FILENAME} !favicon.ico [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?act=$1 [QSA]

    Az oldal addig működik, amíg, csak a domain név van beírva.
    Mihelyt beírok a domain mögé egy ilyet /valami/site

    Egyből azt írja, ki hogy a keresett file nem található.

    Mi lehet itt a bibi?

    Köszi a segítséget előre is.

  70. rrd
    2008 május 16. 13:37:16

    esetleg ez: RewriteRule ^(.*)valami/(.*)$ index.php?oldal=$2 [NC,QSA,L]

  71. Csaba
    2008 május 16. 13:50:51

    Semmi változás :)

  72. rrd
    2008 május 16. 14:54:11

    Csaba: akkor próbáld meg úgy, hogy a következő 4 sort kikommenteled. Jónak kellene lennie, itt teszteltem: http://webmania.cc/static/pregteszt.php
    Megy egyáltalán a rewrite? Dob hibát ha beleírsz valami szemetet?

  73. Csaba
    2008 május 16. 15:11:06

    Még mindig nem megy.

    én is teszteltem ott, és nekem is jó volt, azért nem értem, hogy miért nem müködik.

    Rewrite megy-e? Hát nem tudom, hogy milyen hibát kellene, hogy dobjon, de a
    RewriteRule zagyvaság -ra

    404-es A keresett file nem található hibát kaptam.
    Egyébként azért megkérdeztem most e-mailben a szolgáltatót is, válasz még nuku.

    Hát nem tudom, hogy mi a fene lehet. :(

  74. rrd
    2008 május 16. 15:24:53

    Csaba: szedj ki mindent a .htaccess fileodból és írd bele, hogy namosthúdeletesztelem. 500-as Internal Server Errort kellene eredményeznie. Ha nem akkor nem megy a rewrite.

  75. Csaba
    2008 május 16. 15:31:33

    Úgy néz ki tényleg nem megy nálam

    [404] ERROR A keresett file nem található

    Ezt a hibát kaptam.

    Akkor ezt a szolgáltatómnál kellene követelnem, vagy én is tudok ellene tenni valamit?

  76. rrd
    2008 május 16. 15:42:12

    Csaba: szolgáltató tud infót adni.

  77. Csaba
    2008 május 16. 15:46:24

    Köszi a segítséget.

  78. GIstván
    2008 május 22. 23:32:03

    smarty + php, c-paneles tárhely, hova tegyem a htaccesst?
    Ennek elvileg működni kéne:
    Eredeti link
    http://infoabc.hu/index.php?categoryID=37

    htaccess:
    RewriteEngine on
    RewriteRule ^(.*)categoryID/(.*)$ index.php?categoryID=$2 [L]

    hatástalan, alkönyvtárkban van ht. deny from all bejegyzés, a public_html-ben eredetileg nincs htaccess. Ez egy webshop, amitátalkítottam. Itt éppen akadásom van.

  79. GIstván
    2008 május 22. 23:35:45

    a rewrite megy, a hűdepiszkosulletesztelemre 500-as hiba
    (kieg. smarty problémához)

  80. rrd
    2008 május 23. 10:54:04

    GIstván: a public_html-be kell a .htaccess

  81. GIstván
    2008 május 23. 12:00:14

    Szomorú, de a public_html-be helyezve nincs változás. De 500-as hibát könnyedén eltudok érni sima szöveggel, tehát a modul működik. A RewriteRule után bátmit írok, semmi sem történik.

  82. rrd
    2008 május 23. 12:14:04

    GIstván: Most látom, hogy sehol sem írtam le a cikkben, hogy a fenti példa rewrite-okat illene egy ifmodule /ifmodule páros közé rakni, így:
    <IfModule mod_rewrite.c>
    RewriteEngine on
    #és a többi cucc
    </IfModule>

    Ez azért kell, mert ha nincs is bekapcsolva a modul akkor is tudsz ugyan hibát generálni, de a rewrite nem fog nélküle menni. Szóval ha az ifmodul-ok közé téve a hibatesztelő stringet is hibát kapsz, akkor megy a modul, de a szabályoddal van hiba. Ha nem kapsz rá hibát, akkor meg nem megy a modul. Ebben az esetben a szolgáltató tud nyilatkoznia továbbiakról.

  83. GIstván
    2008 május 23. 12:57:02

    Köszönöm a segítséged a alábbi prg:

    RewriteEngine on
    teszt

    lefutása után bejött a hibaüzenet, vagyis megy a modul. Agyalok

  84. rrd
    2008 május 23. 14:02:49

    GIstván: Nem egészen. Ez csak azt jelenti, hogy a .htaccess file kiértékelődik. Ezért kell betenni az ifmodul /ifmodul közé, mert az azon belüli rész már csak akkor fog kiértékelődni ha maga a modul ténylegesen fut. Szóval ha ezen belül van a teszt és hibát dob, akkor tudhatod, hogy tényleg fut a modul is.

  85. GIstván
    2008 május 23. 18:48:55

    Elnézésed kérem, nem írtam le az előbb, hogy ifmodul /ifmodul között próbálkozom. Nagyon az a sejtésem, hogy a smarty templates miatt talán még sem a public_html-be kell tennem. Szerinted, ha minden könyvtárba ugyanazt a .htaccest teszem, de nem jelölöm meg, hogy melyik könyvtárban vagyok, szóval ez működőképes lehet?

  86. rrd
    2008 május 23. 19:22:56

    GIstván: Nem, az úgy nem fog menni. Máskülönben meg a smartynak nem kéne semmit befolyásolnia az ügyön, mert az átirányítás azelőtt történik, hogy a smarty meghívódna.

    A rule-od jó. Hibaüzenetet kapsz ha hülyeséget írsz, elvileg a modul fut. a .htaccess jó névvel szerepel, és olvasható, máskülönben nem kapnál 500-as hibát. Elfogytak az öteleteim.

    Ha hozzáférsz az apache error log-jához, akkor ott esetleg találhatsz valami infót, hogy mi a baja. Vagy elküldheted neme mailben a .htaccess fileodat, letesztelem nálam működik-e.

  87. GIstván
    2008 május 23. 20:32:16

    Erre a proba .htacces-ra:

    bubu
    RewriteEngine on
    RewriteRule ^(.*)categoryID/(.*)$ index.php?categoryID=$2 [L]

    Ezt kapom
    [Fri May 23 19:02:33 2008] [error] [client 84.0.24.199] File does not exist: /home/infoabc/public_html/404.shtml
    [Fri May 23 19:02:33 2008] [error] [client 84.0.24.199] File does not exist: /home/infoabc/public_html/favicon.ico

    Ha a bubu-t kiveszem nincs hibaüzenet, de nem is történik semmi

  88. GIstván
    2008 május 23. 20:35:23

    Bocs, nem jó sort másoltam ki, a bub-s tesztre ezt kaptam
    [Fri May 23 20:32:44 2008] [alert] [client 89.132.54.245] /home/infoabc/public_html/.htaccess: Invalid command ‘bubu’, perhaps mis-spelled or defined by a module not included in the server configuration

  89. rrd
    2008 május 23. 20:43:31

    GIstván: Küld már át nekem azt a .htaccesst úgy ahogy van: rrd[@]1108.cc

  90. Ábel
    2008 május 26. 19:52:51

    Hello!
    Szeretnék egy kis segítséget kérni. Megcsináltam a rewrite függvényeket és működik is, viszont, ha beírok egy címet (http://valami.hu/cikk/12), akkor a böngésző címsorában átíródik a szöveg arra a címre ahoca átírányítom a rewrite-tal (http://valami.hu/index.php?p=cikk&id=12).
    Hogyan tudnám megtartani az előző címet úgy, hogy mégis működjön?

  91. rrd
    2008 május 26. 20:02:17

    Ábel: attól függ hogyan csináltad. Ha használtad az R flag-et akkor ez történik.

  92. Ábel
    2008 május 26. 20:55:02

    RewriteRule ^(.*)cikk/(.*)::(.*)$ http://hsps.hu/index.php?p=news&cikk=$2&datum=$3 [L]

    Így néz ki. Segíts kérlek!

  93. rrd
    2008 május 26. 21:01:58

    Ábel: nem kell a http, csak a relatív út.

    RewriteRule ^(.*)cikk/(.*)::(.*)$ index.php?p=news&cikk=2&datum=3 [L]

  94. Ábel
    2008 május 26. 21:19:19

    Nagyon jó, köszönöm szépen a segítséget! :)

  95. rrd
    2008 július 18. 13:31:52

    Derk: És ha /pics/kep.jpg-ként hivatkozol a képekre?

  96. rrd
    2008 július 18. 13:34:44

    Derk: És ha /pics/kep.jpg-ként hivatkozol a képekre? (a base-sel együtt persze)

  97. Derky
    2008 július 19. 08:50:13

    Ok, most már képek és minden jó. Már csak egy probléma adódott.

    A # jelet nem veszi figyelembe a linkben. Megnéztem más fórumokon és ott se találtam rá megoldást. Az [NE] flag-el néztem és úgyse volt jó.

    RewriteEngine on
    RewriteRule ^.*-([0-9]*)/.*-([0-9]*)\.html$ index.php?main_id=$1&al_id=$2#ugras [L]

    Köszi előre is

  98. Derk
    2008 július 19. 08:56:23

    Szia!

    Nagyon jó a cikked. Végigolvastam a hozzászólásokat is.

    Nekem is az a gondom, hogy minden működik, de a képeket az új nem létező könyvtárba keresi.

    A teljes .htaccess file:

    RewriteEngine on
    RewriteRule ^.*-([0-9]*)/.*-([0-9]*)\.html$ index.php?main_id=$1&al_id=$2 [L]

    Az akarmi.hu/fotermekcsoport-1/altermekcsoport-5 működik, csak a képeket nem találja, mivel azokat is itt keresi.

    A módszer nem működik.

    Előre is köszi a segítséget.

  99. Derk
    2008 július 19. 08:58:51

    Az előbb kivágott egy részt. Gondolom a kacsacsőrök miatt. Megpróbálom a nélkül:

    Hiányzó rész:
    A base href=”http://akarmi.hu/” módszer nem működik.

  100. rrd
    2008 július 19. 09:46:44

    Derk: és hogyan hivatkozol a html-ben a képekre? Amit leírtál annak jónak kellene lennie.

  101. Derk
    2008 július 19. 10:50:25

    Í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

  102. Johny
    2008 július 25. 15:50:03

    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.

  103. rrd
    2008 július 25. 19:36:51

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

  104. Csaba
    2008 július 28. 15:05:10

    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

  105. rrd
    2008 július 30. 18:34:37

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

  106. Yenka
    2008 augusztus 22. 01:11:58

    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!

  107. rrd
    2008 augusztus 22. 07:49:57

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

  108. Yenka
    2008 augusztus 22. 09:57:07

    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!

  109. rrd
    2008 augusztus 22. 13:36:00

    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]

  110. Yenka
    2008 augusztus 22. 14:07:06

    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!

  111. pan
    2008 október 25. 01:54:40

    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…

  112. rrd
    2008 október 25. 12:39:50

    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

  113. pan
    2008 október 26. 00:03:07

    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

  114. rrd
    2008 október 26. 09:08:04

    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.

  115. pan
    2008 október 27. 01:30:30

    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.

  116. rrd
    2008 október 27. 10:01:04

    pan: nem illeszkedik

  117. pan
    2008 október 27. 12:13:06

    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…

  118. tom
    2008 október 28. 14:17:51

    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

  119. DTB
    2008 december 10. 23:24:11

    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

  120. Ludowico
    2009 március 2. 22:02:12

    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

  121. rrd
    2009 március 3. 09:48:47

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

  122. Ludowico
    2009 március 3. 09:56:46

    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.

  123. Ludowico
    2009 március 3. 11:24:03

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

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

  124. Gyurmó
    2009 március 15. 21:19:40

    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.

  125. shamanix
    2009 április 3. 12:20:25

    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

  126. rrd
    2009 április 3. 14:28:20

    @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

  127. shamanix
    2009 április 7. 08:57:29

    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.

  128. rrd
    2009 április 7. 09:35:09

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

  129. shamanix
    2009 április 8. 08:50:05

    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,

  130. shamanix
    2009 április 8. 09:14:33

    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,

  131. thgab
    2009 április 25. 14:17:05

    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.

  132. Edorn
    2009 május 16. 08:44:21

    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

  133. rrd
    2009 május 16. 16:30:04

    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.

  134. Edorn
    2009 május 16. 18:47:22

    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!

  135. Will Code PHP for Food
    2009 május 22. 20:55:53

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

  136. ctrlshift
    2009 május 28. 10:32:18

    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!

  137. rrd
    2009 május 28. 10:43:50

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

  138. ctrlshift
    2009 május 28. 10:59:04

    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!

  139. rrd
    2009 május 28. 11:16:15

    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.

  140. ctrlshift
    2009 május 28. 11:47:12

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

  141. Akron
    2009 június 15. 23:16:15

    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?

  142. rrd
    2009 június 18. 11:48:20

    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.

  143. Akron
    2009 június 19. 21:12:22

    Köszi! Jó ötlet :)

  144. wardprod
    2009 július 1. 18:16:55

    Ü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 :)

  145. Ludowico
    2009 július 27. 10:32:23

    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

  146. tzs
    2009 augusztus 11. 23:16:28

    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…

  147. Áki
    2009 augusztus 29. 11:12:32

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

  148. Markovits György
    2009 október 29. 11:45:08

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

  149. Ádám
    2009 november 12. 12:24:47

    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

  150. Exalt
    2009 november 24. 23:15:31

    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

  151. Exalt
    2009 november 24. 23:42:56

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

  152. Exalt
    2009 november 24. 23:52:04

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

  153. rrd
    2009 november 25. 11:33:29

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

  154. petrob
    2009 november 27. 20:18:49

    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?

  155. rrd
    2009 november 27. 20:26:12

    @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 :)

  156. petrob
    2009 november 28. 17:45:38

    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.

  157. Attila
    2009 december 15. 15:10:56

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

  158. rrd
    2009 december 15. 16:36:11

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

  159. Attila
    2009 december 15. 17:34:34

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

  160. WebMánia » Egy év egy bejegyzésben 2009
    2009 december 31. 19:17:03

    [...] de valahogyan csak kiadja a heti egyet. Két bejegyzés lépte át a 10.000 olvasást, mégpedig az URL átírások, Apache mod-rewrite és a Trackback, pingback megatöbbi, sőt egy harmadik (mégpedig pont az ami rólam szól, az [...]

  161. Csaba
    2010 március 7. 00:44:28

    Szia!

    Lenne egy kérdésem, már sok variációt kipróbáltam, de a megoldás nem akar összejönni.

    A lényeg van egy -htaccess file-om ami, működik mindaddig, amíg az első RewriteRule hajtódik végre, de mihelyst olyan oldalra megyek, amely a 2. rule-ra vonatkozik, akkor a css-t nem tölti be. Mi lehet a gond? Köszi a választ előre is.

    A .htaccess file-om:

    php_value register_globals Off
    Options -Indexes
    Options +FollowSymLinks
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([a-zA-Z]+)$ index.php?act=$1 [QSA,L]
    RewriteRule ^(.*)hirek/([^/]+)(/*)$ index.php?act=news&id=$2 [QSA,L]

  162. rrd
    2010 március 8. 11:31:06

    @Csaba a második szabályod más alkönyvtárra mutat. Innentől kezdve több probléma is lehet attól függően, hogy hogyan hívod meg a css file-t, illetve, hogy a domain gyökérben ül-e az alkalmazás. Olvasgasd el újra a RewriteBase részt, illetve a hozzászólások között is találsz ilyesmiket.

  163. Csaba
    2010 március 8. 16:46:02

    Köszönöm, megoldottam.

  164. Alex
    2010 április 18. 19:01:07

    Szia!
    Nagyon jó a cikk, viszont nem találtam meg benne a problémámra a választ. Azt akarom megoldani, hogy itt ez a példa link:
    http://dominem.hu/joomla_cm/kapcsolatok/
    A joomla_cm könyvtárba van telepítve a Joomla. De én azt akarom, hogy a böngészőben csak ennyi jelenjen meg:
    http://dominem.hu/kapcsolatok/

    A webszerver gyökérkönyvtárában már van egy htaccess ami a http://domainem.hu átirányítja a http://domainem.hu/joomla_cm/-re. Ez így jó is, de hogyan tudnám kivágni a linkből a joomla_cm-et, hogy ezt mások ne lássák?

    a Joomla alap htaccess-ben ezek vannak:
    RewriteEngine On
    # RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !^/index.php
    RewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$ [NC]
    RewriteRule (.*) index.php
    RewriteRule .* – [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

    Hogyan egészítsem ezt ki? Mert eddig sehogy sem lett jó.

    Előreis köszi!

  165. rrd
    2010 április 19. 16:14:19

    @Alex a webserrver gyökerében lévő htaccessnek nem átirányítani kellene, hanem átirnia valahogy így:
    RewriteRule (.*) joomla_cm/$1 [L]

    Mondjuk ez minden hivatkozást átirányít az alkönyvtárra ami nem tudok, hogy a te esetedben megfelelő-e. De a többit szerintem a cikk alapján már összehozod.

  166. Alex
    2010 április 21. 20:06:02

    Köszönöm a válaszod, de a te megoldásod csak a Főoldalon működött jól. Aztán rájöttem, hogy túlbonyolítottam a dolgokat, és már meg van a megoldás a problémámra! :-)

  167. Pityu
    2010 május 16. 12:35:06

    Sziasztok!
    Sikerült beüzemelni ezt az átírásos témát a weboldalamon de azt szeretném hogy amikor beírja valaki az url-t pld:. http://www.oldalam.com/hu/2 akkor az maradjon is úgy tehát ne írja át.
    Remélem nem kérdeztem lehetetlent.
    Köszönöm a válaszokat előre is:)

  168. rrd
    2010 május 17. 10:32:31

    @Pityu erre a kérdésre legalább 2 féle megoldás van a cikkben. Negáld valamelyik feltételedet, vagy erre az url-re ne csinálj semmit egy L flag-gel.

  169. Pityu
    2010 május 17. 14:45:58

    Üdv!
    Lehet hogy nem jól fogalmaztam.
    tehát azt akarom, hogyha beírom azt hogy
    http://www.oldalam.hu/2/1
    akkor fusson le az oldalam.hu/index.php?m=2&s=1
    de a böngészőben az
    http://www.oldalam.hu/2/1
    legyen látható.
    Ha ez is benne van a leírásban akkor nagyon vak vagyok, mert nem találom:S

  170. rrd
    2010 május 17. 15:21:55

    @Pityu igen, erről szól az egész cikk :) Az R flag való a tényleges átirányításra, ha ezt nem használod akkor az url nem változik meg a böngészőben, csak az apache fogja úgy értelmezni mintha át lenne írva.
    Olvasd át még egyszer és kísérletezz.

  171. Pityu
    2010 május 17. 15:47:23

    ÜDv : )
    Márpedig én nem használom az [R] flaget.
    itt a htaccessem:

    RewriteEngine on
    Options +FollowSymLinks
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule (.*)/(.*)/?$ http://www.brillngjd.com/index.php?lang=$1&m=$2

  172. rrd
    2010 május 17. 16:45:05

    @Pityu Nagyjából valami ilyesminek kell lennie. Mi a gond vele?

  173. Pityu
    2010 május 17. 16:55:52

    ÜDv!
    Az a gond vele, hogy a böngészőben látom hogy átvált a cím.
    Ezt szeretném valahogy kiküszöbölni:/

  174. rrd
    2010 május 17. 17:06:28

    @Pityu nem szabadna átíródnia, legalábbis ettől nem. Tedd mögé a [L] flag-et.
    De szerintem valami más van ott ami átírja. Próbálj meg betenni valami szemetet a .htaccess-be illetve meghívni olyan paraméterekkel amik biztosan hibásak és figyeld, hogy milyen hibákat kap. Ha nem megy akkor nyiss egy topicot a weblabor.hu fórumon, itt nem fogjuk tudni kibogozni.

  175. Imre
    2010 május 18. 14:24:01

    Szia!

    A problémám a következő. Átlinkelek egy aloldalra, mod_rewrite működik szépen, de amikor onnan jönnék vissza két paraméterrel akkor valamiért belekavarodik a visszafejtésbe. Visszafelé az index.php-t hívnám meg két praméterrel. De azt látom hogy duplikálja a paramétereket. Elgondolásom szerint ezzel a sorral RewriteCond %{REQUEST_FILENAME} index.php [NC] gondoltam feltételt állítani azt ezt követő rule-nak.

    a htaccess file tartalma:
    Options +FollowSymLinks
    RewriteEngine on
    RewriteOptions MaxRedirects=10
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule \.css$ /mobile.css [NC]

    RewriteCond %{REQUEST_FILENAME} index.php [NC]
    RewriteRule ^([0-9]+)/([0-9]+).html$ index.php?selectid=$1&page=$2 [L]

    RewriteRule ^([0-9]+)/([0-9]+)/([0-9]+)/([0-9a-zA-Z_-]*).html$ reszletek.php?utazasid=$1&select=$2&page=$3&szallas=$4 [L,QSA]
    RewriteRule ^([0-9]+)/([0-9]+)/([0-9a-zA-Z_-]*).html$ reszletek.php?utazasid=$1&page=$2&szallas=$3 [L,QSA]
    ErrorDocument 404 /404.php

  176. rrd
    2010 május 19. 11:12:37

    @Imre szerintem nem kell a QSA. Ha ez nem segít akkor a weblabor.hu fórumán folytassuk :)

  177. Tamás
    2010 május 30. 08:21:38

    Szia!

    tudnál segíteni Apache web szerveren az alábbi átirányítás vagy átírás kivitelezésében? Szeretek hasonló dolgokat kitalálni, de most egy dolog miatt nem akarom magam ezzel kínozni.

    “http://akarmi.hu” vagy “http://akarmi.hu/” szeretném átírni/átirányítani

    ide:
    akarmi.hu/itt_akarmi_lehessen
    pl.: akarmi.hu/program/login?uid=anonymous&upwd=anonymous

    Előre is köszi,
    üdv.: Cs. Tamás

  178. Tamás
    2010 május 30. 09:01:25

    Előbbi kérdésemre meg is találtam a választ, így ne törjétek magatokat ezzel!

    Usually the DocumentRoot of the webserver directly relates to the URL “/”. But often this data is not really of top-level priority. For example, you may wish for visitors, on first entering a site, to go to a particular subdirectory /about/. This may be accomplished using the following ruleset:

    Solution:
    We redirect the URL / to /about/:

    RewriteEngine on
    RewriteRule ^/$ /about/ [R]
    Note that this can also be handled using the RedirectMatch directive:

    RedirectMatch ^/$ http://example.com/e/www/

  179. Roland28
    2010 június 21. 22:42:38

    Szia(sztok)!

    Adott az alábbi .htaccess…

    Options +FollowSymLinks
    DirectoryIndex index.php
    ErrorDocument 404 /index.php
    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?page=$1 [QSA]

    Miért nem működik a rövid URL!?

    http://oldalam.hu/?page=xxx

    NEM TUDOM ELTÜNTETNI EZT:(
    (A MENÜK IS CSÚNYÁK)

    http://oldalam.hu/xxx

    EZT SZERETNÉM LÁTNI HA KATTINTOK…
    Lécci segítsetek mert kezdem unni!!

    Üdv.

  180. rrd
    2010 június 22. 08:29:38

    @Roland28 Megy egyáltalán a rewrite modul? Először azt kellene ellenőrizni.

  181. Roland28
    2010 június 22. 09:12:29

    Persze hogy megy! “félig” jól is…
    beírom http://oldalam.hu/valami
    elindul http://oldalam.hu/?page=valami
    DE NEM “CSAK” EZT AKAROM:(

    Ha az oldalon bármilyen menüre kattintok:)
    ÍGY JELENJEN MEG!!

    http://oldalam.hu/valami

  182. rrd
    2010 június 22. 09:32:07

    @Roland28 Első körben azt javaslom, hogy olvasd el még egyszer figyelmesen a cikket, benne van a válasz. Valami ilyesmi lesz: RewriteRule (.*) index.php?page=$1 de jobb ha tudod, hogy mit csinálsz mint ha találgatsz.

  183. Roland28
    2010 június 23. 15:27:56

    Köszi! Átolvastam többször…
    De nem vezet megoldásra:(
    Ugyanez van nekem is!!
    (a leírás szerint)

  184. Feru
    2010 augusztus 16. 17:31:19

    Szia!

    Végigolvastam a cikked, de sajnos nem tudom megvalósítani a keresőbarát url-t :(

    RewriteEngine on

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule ^cegunkrol(.*)$ index.php?page=menu&id=$1 [L]

    erre kérnék egy kis segítséget, előre is köszönöm

  185. rrd
    2010 augusztus 17. 09:01:00

    @Feru És mi nem működik?A szabályod azt mondja, hogy ha az url-ben a domain után annyi van, hogy cegunkrol es nincs se előtte se utánna semmi – beleértve a / jelet akkor irányítsa át

  186. Feru
    2010 augusztus 18. 08:35:31

    rrd már csak annyi a bajom, hogy nem tudom milyen kódot kellene a php-ba beletennem :(

  187. rrd
    2010 augusztus 18. 11:13:48

    @Feru a PHP-ba? Oda semmit.