apache“Sok tonnányi leírás és példa ellenére a mod_rewrite voodoo. Átkozottul jó voodoo, de még mindig csak voodoo.”

(Brian Moore)
Mivel magyarul egyáltalán nem találtam egy normális összefüggő leírást az Apache mod_rewrite moduljáról, figyelembevéve a fenti kijelentést, gondoltam megpróbálok összeállítani egy rövid, összefoglaló cikket erről a jól konfigurálható ügyes kis modulról.

Előszőr nézzük a konfigurációs beállításokat, aztán pedig hozzunk létre egy saját .htaccess file-t ezek alapján!

Konfigurációs beállítások

RewriteEngine

Szintakszis: RewriteEngine on|off

A
RewriteEngine direktívával engedélyezhetjük vagy tilthatjuk a Rewrite
modul futását. Alapértelmezésben off-ra van állítva, és ha tiltani
akarjuk a Rule-okat akkor célszerű ezt off-ra állítani mindne egyes
Rule kikommentezése helyett.

RewriteOptions

Szintakszis: RewriteOptions Opció

Ezzel a direktívával speciális beállításokat kapcsolhatunk be. Az opciók a következők lehetnek:

inherit
A jelenlegi konfiguráció a szülő konfigurációját
örökli. Ez virtuális szervernél a fő szerver szabályainak az öröklését
jelenti, a .htaccess file esetében a szülő könyvtár .htaccess file
beállításainak öröklését jelenti.
MaxRedirects=szám
Annak elkerülése érdekében, hogy a
szabályaink végtelen ciklust hozzanak létre az alapbeállítás 10, vagyis
10 átírányítás után az átirányítások leállnak egy “500 Internal Server
Error”-ral.

RewriteLog, RewriteLogLevel, RewriteLock, RewriteMap

Ezeket a beállításokat nem lehet a lokális .htaccess fileokból
állítgatni. Így ezekről most nem írok, aki kíváncsi rájuk olvassa el a
forrásoknál felsorolt linkeken.

RewriteBase

Szintakszis: RewriteBase URL

Ez
a direktíva beállítja az alap URL-t a könyvtárfüggő (.htaccess)
szabályokhoz. Az itt megadott könyvtárnév automatikusan le lesz véve a
vizsgált URL-ből és a szabályok végén automatikusan hozzáadásra kerül.
Ha a webszerver URL-jei nem közvetlenül feleltethetőek meg a
fizikai file elérési utakkal, akkor minden .htaccess fileban használni
KELL a RewriteBase direktívát ha használni akarod a RewriteRule
direktívát is.

RewriteCond

Szintakszis: RewriteCond TesztString FeltételMinta

A
RewriteCond direktívával tudunk feltételes szabályokat létrehozni. Az
ezt követő RewriteRule csak akkor kerül végrehajtásra, ha maga a
szabály és az őt megelőző RewriteCond is teljesül.

A TesztString a következő elemekkel egészíthető ki:

RewriteRule hivatkozás $N
(0 <= N <= 9) ami elérést biztosít a kapcsolódó RewriteRule mintában található zárójelekkel létrehozott részhez.
RewriteCond hivatkozás %N
(1 <= N <= 9) ami elérést biztosít a legutolsó egyező RewriteCond minta részeihez.
RewriteMap bővítés ${mapname:key|default}
Szerver változók %{VÁLTOZÓ}
ahol a szerverváltozók a következők lehetnek:

  • HTTP_USER_AGENT
  • HTTP_REFERER
  • HTTP_COOKIE
  • HTTP_FORWARDED
  • HTTP_HOST
  • HTTP_PROXY_CONNECTION
  • HTTP_ACCEPT
  • REMOTE_ADDR
  • REMOTE_HOST
  • REMOTE_USER
  • REMOTE_IDENT
  • REQUEST_METHOD
  • SCRIPT_FILENAME
  • PATH_INFO
  • QUERY_STRING
  • AUTH_TYPE
  • DOCUMENT_ROOT
  • SERVER_ADMIN
  • SERVER_NAME
  • SERVER_ADDR
  • SERVER_PORT
  • SERVER_PROTOCOL
  • SERVER_SOFTWARE
  • TIME_YEAR
  • TIME_MON
  • TIME_DAY
  • TIME_HOUR
  • TIME_MIN
  • TIME_SEC
  • TIME_WDAY
  • TIME
  • API_VERSION
  • THE_REQUEST
  • REQUEST_URI
  • REQUEST_FILENAME
  • IS_SUBREQ

A FeltételMinta egy sztenderd reguláris kifejezés pár kiegészítéssel.

  1. A minta előtt meg lehet adni egy !-et, ezzel tagadjuk a mintát,
    vagyis az ezt követő szabály akkor kerül végrehajtásra, ha a TesztSring
    nem passzol a megadott mintára
  2. Elérhető pár speciális FeltételMinta megadása is. Reguláris kifejezés helyett használhatók a következők:
    <'FeltételMinta'
    A feltételMintát sima sztirngként kezeli és azt vizsgálja, hogy lexikálisan kisebb-e mint a TesztString.
    ‘>FeltételMinta’
    A feltételMintát sima sztirngként kezeli és azt vizsgálja, hogy lexikálisan nagyobb-e mint a TesztString.
    ‘=FeltételMinta’
    A feltételMintát sima sztirngként kezeli
    és azt vizsgálja, hogy lexikálisan megyezik-e a TesztStringgel, azaz
    betűről betűre azonosak-e.
    ‘-d’ (könyvtár?)
    Megvizsgálja, hogy a TesztString egy létező könyvtár-e.
    ‘-f’ (file?)
    Megvizsgálja, hogy a TesztString egy létező file-e.
    ‘-s’ (file mérettel?)
    Megvizsgálja, hogy a TesztString egy létező file-e és mérete nagyobb-e mint 0.
    ‘-l’ (szimbolikus link)
    Megvizsgálja, hogy a TesztString egy szimbolikus link-e.
    ‘-F’ (létező file via subrequest)
    Megvizsgálja, hogy a
    TestString egy létező file-e, és elérhető-e a szerver konfigurációjában
    szereplő elérési korlátozások szerint.
    ‘-U’ (létező URL via subrequest)
    Megvizsgálja, hogy a
    TestString egy létező URL-e, és elérhető-e a szerver konfigurációjában
    szereplő elérési korlátozások szerint.

Ezeket kiegészítve használhatók az alábbi flag-ek (vesszővel elválasztott listaként) is mint a RewriteCond direktíva harmadik argumentuma.

‘nocase|NC’ (no case: ne figyelje a betűméretet)
Ennek a
flag-nek a hatására a FeltételMinta és a TesztString nem lesz érzékeny
a kis és nagybetűk közötti különsbségre, azokat azonosnak tekinti.
‘ornext|OR’ (or next condition: vagy a következő feltétel)
Ennek
a flag-nek a hatására az alapértelmezett ÉS logikai kapcsolat helyett
az egyes RewriteCond direktívákat VAGY logikai kapcsolattal kezelhetjük.

RewriteRule

Szintakszis: RewriteRule Minta Helyettesítés

A
RewriteRule directíva a tényleges URL átíró utasítás. A directíva több
mit egyszer is előfordulhat, külön-külön szabályt alkotva. A szabályok
sorrendje fontos, mert a .htaccess file-ban lévő sorrendben hajtódnak
végre.

A Minta egy reguláris kifejezés amit az
aktuális URL-lel hasonlít össze a szabály. Az aktuális itt azt jelenti,
hogy ezt a szabályt megelőző szabályok már modósíthatták az eredeti, a
user által beírt URL-t.

Pár szóban a reguláris kifejezésekről.

A reguláris kifejezés egy minta amit egy karaktersorozat általános
leírására, összehasonlítására alkalmazhatunk. A következő táblázat
mutatja, hogy melyik jel mely karaktereket helyettesít a reguláris
kifejezésekben.

  • Szöveg
    . (pont)
    Bármilyen karakter
    [karakterek]
    Karakter osztály: bármely a zárójelek között felsorolt karakterek közül
    [^karakterek]
    Karakter osztály: egy sem a zárójelek között felsorolt karakterek közül
    szöveg1|szöveg2
    Alternatívák: szöveg1 vagy szöveg2
  • Számlálók
    ?
    0 vagy 1 a megelőző szövegből
    *
    0 vagy több a megelőző szövegből
    +
    1 vagy több a megelőző szövegből
  • Csoportosítás
    (szöveg)
    Szöveg részekre bontása zárójelekkel, vagy
    határolóelemként alternatív szövegek meghatározásához, vagy padig
    hivatkozások létrehozásához ($N)
  • Helymeghatározók
    ^
    A szöveg eleje
    $
    A szöveg vége
  • Escaping
    karakter
    Ezzel tiltjuk, hogy egy speciális karakter speciálisan legyen értelmezve

A Helyettesítés egy sztring ami az
eredti mintát helyettesíti vagy kiegészíti. Használhatók benne a
hivatkozások melyek a szabályra utalnak ($N), hivatkozások melyek a
feltételre utalnak (%N), szerver változók és mapping funkciók.

Speciális
helyettesítő parancs a ‘-‘, aminek a hatására nem történik
helyettesítés. Ez első olvastra furán hangzik, de a ‘C’ flag
ismeretében értelmet fog nyerni.

A RewriteRule direktíva harmadik argumentumaként használhatjuk az alábbi flag-eket:

‘redirect|R [=code]’ (force redirect)
Közvetlen
átirányítás. A Helyettesítés-nek egy létező URL-nek kell lennie,
máskülönben egy nemlétező helyre irányítjuk át a usert.
‘forbidden|F’ (force URL to be forbidden)
Egy 403-as HTTP response-t (FORBIDDEN) küld vissza. Egy ehhez tartozó RewriteConds direktívával blokkolhatunk bizonyos URL-eket.
‘gone|G’ (force URL to be gone)
eEgy 410-es HTTP response-t
(GONE) küld vissza. Többé már nem létező lapokat jelölhetünk meg vele.
(pl azzal a céllal, hogy a keresők kivegyék az indexükből az oldalt.)
‘proxy|P’ (force proxy)
A kérés proxy kérésként lesz kezelve, így automatikusan átadódik a proxy modulnak.
‘last|L’ (last rule)
Megállítja az átíró folyamatot ennél a szabálynál, nem hajtja végre az ezt követő szabályokat.
‘next|N’ (next round)
Újraindítja az átíró folyamatot
(újrakezdi az első szabálynál). Ebben az alfolyamatban nem az eredeti
URL-t fogja vizsgálni, hanem az éppen aktuálisat.
‘chain|C’ (chained with next rule)
Összekapcsolja a
jelenlegi szabályt a következővel. Ha a szabály egyezik akkor a normál
menet szerint a következőt is vizsgálni fogja, de ha a jelenlegi
szabály nem egyezik akkor a következőt NEM vizsgálja.
‘type|T=MIME-type’ (force MIME type)
A cél file MIME-type-ját állítja be./dd>
‘nosubreq|NS’ (used only if no internal sub-request)
‘nocase|NC’ (no case)
A mintát érzéketlenné teszi a kis és nagybetűk közötti különbségekre.
‘qsappend|QSA’ (query string append)
A jelenlegi URL-hez hozzá tudunk fűzni további adatokat.
‘noescape|NE’ (no URI escaping of output)
Ne használja az escape eljárást
‘passthrough|PT’ (pass through to next handler)
‘skip|S=num’ (skip next rule(s))
Ha a jelenlegi szabály végrehajtódik akkor a következő ‘num’ db szabályt nem vizsgája, nem hajtja végre.
‘env|E=VAR:VAL’ (set environment variable)

Minta .htaccess file

Először is kapcsoljuk be a RewriteEngine-t és maximalizáljuk a lehetséges átírások számát, nehogy végtelen ciklusba jussunk.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteOptions MaxRedirects=10
</Ifodule>

Adjuk meg az alkönyvtár nevét is amiben éppen vagyunk,
ahhhoz, hogy az átírásaink jól működjenek. Ez persze nem kell ha a
websiteunk főkönyvtárában lévő .htaccess filet szerkesztjük.

RewriteBase /gora

Első lépésként azt szeretnénk, hogy a CMS-ünk által
generált rendkívül rusnya URL-t emberek számára is olvashatóvá tegyük.
http://webmania.cc/index.php?modul=recept&recept=23 URL-t
szeretnénk egyszerűsíteni és átirni a http://webmania.cc/receptek/23
formátumra. Illetve ez nem teljesen igaz. Azt szeretnénk, hogy ha a user (vagy maga a CMS) egy http://webmania.cc/receptek/23 kinézetű URL-t kér le a webszervertől, akkor az ezt a háttérben, a user számára láthatatlanul alakítsa át arra a valódi URL-re amin ez a tartalom megtalálható (http://webmania.cc/index.php?modul=recept&recept=23)
A szabályban a $2 a második zárójelek közötti részt jelenti, vagyis esetünkben a 23-at, a harmadik zárójelben lévő kifejezés pedig arra szolgál, hogy akár perjellel, akár a nélkül zárja le a user a beírt URL-t a szabályunk működjön. Mivel ha a vizsgált URL illeszkedik erre a mintára már nem akarunk semmilyen más átalakítást végezni vele kitesszük az [L] flaget.

Az átírási szabályoknál figyelni kell a következőre. Esetünkben ha van a domainünknek egy a receptek mintára illeszkedő file-ja / könyvtára, akkor az oda mutató linkek használhatatlanná válhatnak. Pl az “imgrecept” nevű könyvtárban lévő képek elérhetetlenné válnak, mivel a szabályunk a http://webmania.cc/imgrecept/borfi.jpg hivatkozást át fogja alakítani a http://webmania.cc/index.php?modul=recept URL-re. Ez ellen két módon védekezhetünk. Vagy gondoskodunk arról, hogy a létező fileokat kiszolgálja, vagy pedig óvakodunk az olyan hivatkozások használatától aminek a mintája illeszkedik valamely létező könyvtár vagy filenévre.

RewriteRule ^(.*)receptek/([^/]+)(/*)$ index.php?modul=recept
   &recept=$2 [L]

Ugyanezzel a módszerrel alakítsuk át a http://webmania.cc/index.php?lap=17 típusú hivatkozásokat. Ezt mondjuk úgy szeretnánk olvasható URL-lé alakítani, hogy http://webmania.cc/lap/17.

#kategoriák rövid számos elérése
   RewriteRule ^(.*)lap/(.*)$ index.php?lap=$2 [L]

Hasonlóan a http://webmania.cc/index.php?kategoria=17 is ronda egy URL. Ez mondjuk egy kiemelt téma, kétféleképpen is szeretnénk átalakítani (a sorrend ugye fontos):

  1. http://webmania.cc/rovat/17
  2. http://webmania.cc/hirek (bizonyos feltétel esetén, mondjuk a domain név alapján ha a .htaccess fileunk több domaint is kiszolgál)
#kategoriák rövid számos elérése
   RewriteRule ^(.*)rovat/(.*)$ index.php?kategoria=$2 [L]
#weblap specifikus rész
   #krisnavolgy.hu
      RewriteCond %{SERVER_NAME} krisnavolgy.hu
      RewriteRule ^(.*)hirek(.*)$ index.php?kategoria=17 [L]

Itt is használtuk az [L] flaget, mert nem kívánunk több átalakítást végezni ha a minta passzol. A weblapspecifikus rész csak akkor fog végrehajtódni, ha a feltétel teljesül, vagyis ha a domainnév krisnavolgy.hu. RewriteCond esetén figyelnünk kell arra, hogy csak a közvetlenül utánna következő egy RewriteRule-ra fog a feltétel érvényesülni. Tehát ha több szabályt is akarunk alkalmazni ugyanarra a feltételre akkor azt többször meg kell adni.

Végül ha a user nemlétező URL-t akar meghívni akkor irányítsuk rá a nyitóoldalra, és az általa kért nemlétező címet tegyük be a hack nevű $_GET változóba.

   #ha nincs favicon
   RewriteCond %{REQUEST_FILENAME} !favicon.ico [NC]

#ha nemlétező a file RewriteCond %{REQUEST_FILENAME} !-f

#ha nemlétező a könyvtár RewriteCond %{REQUEST_FILENAME} !-d #akkor legyen átirányítás RewriteRule ^(.*)$ index.php?hack=$1 [QSA]

És akkor lássuk az egészet együtt.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteOptions MaxRedirects=10

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

RewriteRule ^(.*)receptek/([^/]+)(/*)$ index.php?modul=recept &recept=$2 [L] RewriteRule ^(.*)receptek$ index.php?modul=recept [L]

#a lap/72 tipusúak átírása RewriteRule ^(.*)lap/(.*)$ index.php?lap=$2 [L] #kategoriák rövid számos elérése RewriteRule ^(.*)rovat/(.*)$ index.php?kategoria=$2 [L] #weblap specifikus rész #krisnavolgy.hu RewriteCond %{SERVER_NAME} krisnavolgy.hu RewriteRule ^(.*)hirek(.*)$ index.php?kategoria=66 [L] RewriteCond %{SERVER_NAME} krisnavolgy.hu RewriteRule ^(.*)naplo(.*)$ index.php?kategoria=111 [L] #Minden nemletezo oldal webcimet iranyitsuk at az index.php-re #ennek a végén kell lennie, mert máskülönben #a rövidítendő webcímeket is kiszűri #ha nincs favicon RewriteCond %{REQUEST_FILENAME} !favicon.ico [NC] #ha nemlétező a file RewriteCond %{REQUEST_FILENAME} !-f #ha nemlétező a könyvtár RewriteCond %{REQUEST_FILENAME} !-d #akkor legyen átirányítás RewriteRule ^(.*)$ index.php?hack=$1 [QSA] </IfModule>

URL átírások

Egyszerűsített URL-ek

Leírás:
Néhány webszerveren több mint egy URL tartozik egy forráshoz. Ezek általában egyszerűsített URL-ek (melyek könnyen megjegyezhetőek), vagy gyorslinkek, stb. Függetlenül attól, hogy a user melyik URL-t írta be végül az egyszerűsítettet kell látnia.
Megoldás:
Egy külső HTTP átirányítást fogunk alkalmazni a nem egyszerűsített URL-ek esetében, hogy a böngészők Hely (Location) mezőjében az egyszerűsítettek jelenjenek meg. Példánkban a /~user-t fogjuk az egyszerűsített /u/user-re fogjuk átírni és hozzáadunk egy záró perjelet.

    RewriteRule   ^/~([^/]+)/?(.*)    /u/$1/$2  [R]
    RewriteRule   ^/([uge])/([^/]+)$  /$1/$2/   [R]
		

Egyszerűsített hostnevek

Leírás:
Ennek a szabálynak az a célja, hogy ráerőszakoljuk a userra, hogy egy bizonyos hostnevet használjon más hostnevek helyett amelyeket ugyanehhez a weblaphoz használhatna. Például azt akarjuk, hogy a www.kivagyok.hu hostnevet akarjuk a userekkel használtatni a sima kivagyok.hu helyett.
Megoldás:
Ha a site nem a 80-as porton fut:

    RewriteCond %{HTTP_HOST}   !^www.kivagyok.hu [NC]
    RewriteCond %{HTTP_HOST}   !^$
    RewriteCond %{SERVER_PORT} !^80$
    RewriteRule ^/(.*)         http://www.kivagyok.hu:
         %{SERVER_PORT}/$1 [L,R]
		

Ha a site a 80-as porton fut:

    RewriteCond %{HTTP_HOST} !^www.kivagyok.hu [NC]
    RewriteCond %{HTTP_HOST} !^$
    RewriteRule ^/(.*)       http://www.kivagyok.hu/$1 [L,R]
		

Virtuális hostok

Leírás:
Ha szeretnénk egy www.felhasznalonev.host.hu nevet egy felhasználó weboldalaként virtulahost nélkül, akkor…
Megoldás:
HTTP/1.0 requestekhez nincs megoldás, de HTTP/1.1 requesteknél ami tartalmaz egy Host: HTTP header, akkor használhatjuk a következő szabályokat ahhoz, hogy átírjuk a http://www.felhasznalonev.host.hu/balamber-t /home/balamber/barmi-ra:

    RewriteCond %{HTTP_HOST}             ^www.[^.]+.host.hu$
    RewriteRule ^(.+)                    %{HTTP_HOST}$1 [C]
    RewriteRule ^www.([^.]+).host.hu(.*) /home/$1$2
		

Időpontfüggő átirányítás

Leírás:
Például egy időpont függő megjelenéshez általában valami scriptet hazsnálunk (például PHP-t), de hogyan tudjuk ezt a mod_rewrite-on keresztül?
Megoldás:
Van egy rakat változó, a TIME_xxx. Ezeket a lexikális összehasonlítással, vagyis a > < és = jelekkel tudjuk vizsgálni.
    RewriteCond   %{TIME_HOUR}%{TIME_MIN} >0700
    RewriteCond   %{TIME_HOUR}%{TIME_MIN} <1900
    RewriteRule   ^foo.html$             nappal.html
    RewriteRule   ^foo.html$             ejszaka.html
		

Ezzel a szabállyal ezt érjük el, hogy reggel 7 és este 7 között a nappal.html fog megjelenni, a többi időben pedig az ejszaka.htm. Ha ezeknek eltérő a tartalma, vagy a designja, akkor az elég izgalmas, nem?

Robot-elérés korlátozás

Leírás:
Hogyan tudunk egy zavaró robotot kitiltani a webszerverünk egy bizonyos területéről? A /robots.txt nem mindig elég ahhoz, hogy egy erőszakos robotot kitiltsunk.
Megoldás:
A lenti szabály letiltja a /~quux/foo/arc/ könyvtár elérését a robot részére. Ügyelnünk kell arra, hogy csak a robotot tiltsuk ki és a felhasználók hozzáférhessenek az oldalhoz. Ehhez megnézzük, hogy a HTTP_USER_AGENT változóban a robot neve van-e, és azt, hogy arról az IP címről jön-e ahonnan a robot szokott. Ha igen akkor küldünk neki egy “Felejts már el!” [F] üzenetet.

    RewriteCond %{HTTP_USER_AGENT}   ^aCsunyaRobotNeve.*
    RewriteCond %{REMOTE_ADDR}       ^123.45.67.[8-9]$
    RewriteRule ^/~quux/foo/arc/.+   -   [F]
		

Források:

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

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

  • 2007. június 03. at 11:29:38
    Permalink

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

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

    Válasz
  • 2007. június 03. at 11:35:39
    Permalink

    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]

    Válasz
  • 2007. június 04. at 06:27:33
    Permalink

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

    Válasz
  • 2007. június 04. at 09:46:06
    Permalink

    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?

    Válasz
  • 2007. június 05. at 01:11:28
    Permalink

    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.

    Válasz
  • 2007. június 09. at 07:52:47
    Permalink

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

    Válasz
  • 2007. június 20. at 09:04:31
    Permalink

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

    Válasz
  • 2007. június 20. at 09:49:20
    Permalink

    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

    Válasz
  • 2007. június 20. at 15:33:26
    Permalink

    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.

    Válasz
  • 2007. július 22. at 11:24:26
    Permalink

    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!

    Válasz
  • 2007. július 23. at 06:55:37
    Permalink

    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.

    Válasz
  • 2007. augusztus 02. at 21:38:19
    Permalink

    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.

    Válasz
  • 2007. augusztus 08. at 13:43:02
    Permalink

    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!

    Válasz
  • 2007. augusztus 08. at 19:07:25
    Permalink

    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

    Válasz
  • 2007. augusztus 09. at 09:25:31
    Permalink

    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

    Válasz
  • 2007. augusztus 10. at 12:40:33
    Permalink

    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.

    Válasz
  • 2007. augusztus 10. at 14:24:58
    Permalink

    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 🙂

    Válasz
  • 2007. augusztus 10. at 16:20:54
    Permalink

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

    Válasz
  • 2007. augusztus 11. at 07:43:10
    Permalink

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

    Válasz
  • 2007. augusztus 14. at 21:01:05
    Permalink

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

    Válasz
  • 2007. szeptember 29. at 18:26:24
    Permalink

    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?

    Válasz
  • 2007. szeptember 30. at 14:21:22
    Permalink

    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.

    Válasz
  • 2007. október 03. at 16:00:48
    Permalink

    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!

    Válasz
  • 2007. október 04. at 15:07:24
    Permalink

    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.

    Válasz
  • 2007. október 12. at 07:04:14
    Permalink

    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

    Válasz
  • 2007. október 12. at 07:09:04
    Permalink

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

    Válasz
  • 2007. október 12. at 09:40:13
    Permalink

    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

    Válasz
  • 2007. október 13. at 02:11:44
    Permalink

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

    Válasz
  • 2007. október 13. at 14:31:09
    Permalink

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

    Válasz
  • 2007. október 14. at 09:38:40
    Permalink

    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

    Válasz
  • 2007. október 26. at 11:37:19
    Permalink

    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

    Válasz
  • 2007. október 27. at 05:18:31
    Permalink

    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.

    Válasz
  • 2007. november 06. at 07:59:07
    Permalink

    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

    Válasz
  • 2007. november 06. at 19:06:59
    Permalink

    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 😛

    Válasz
  • 2007. november 06. at 19:11:37
    Permalink

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

    Válasz
  • 2007. november 06. at 19:34:22
    Permalink

    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.

    Válasz
  • 2007. november 06. at 19:54:07
    Permalink

    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

    Válasz
  • 2007. november 06. at 20:31:43
    Permalink

    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.

    Válasz
  • 2007. november 06. at 21:58:49
    Permalink

    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.

    Válasz
  • 2007. november 06. at 22:05:41
    Permalink

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

    Válasz
  • 2007. november 06. at 22:11:14
    Permalink

    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

    Válasz
  • 2007. november 06. at 22:40:28
    Permalink

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

    Válasz
  • 2007. november 06. at 23:15:06
    Permalink

    aha persze, de megprobaltam mar anelkul is.

    Válasz
  • 2007. november 26. at 09:52:02
    Permalink

    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?

    Válasz
  • 2007. november 26. at 17:19:27
    Permalink

    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?

    Válasz

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

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