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. november 26. at 17:45:58
    Permalink

    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?

    Válasz
  • 2007. november 26. at 18:00:29
    Permalink

    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.

    Válasz
  • 2007. november 27. at 19:52:11
    Permalink

    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]

    Válasz
  • 2007. november 27. at 19:53:02
    Permalink

    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]

    Válasz
  • 2007. november 28. at 09:52:49
    Permalink

    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.

    Válasz
  • 2007. november 28. at 11:52:21
    Permalink

    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]

    Válasz
  • 2008. március 07. at 02:46:17
    Permalink

    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

    Válasz
  • 2008. március 07. at 09:47:42
    Permalink

    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.

    Válasz
  • 2008. március 07. at 15:46:40
    Permalink

    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?

    Válasz
  • 2008. március 07. at 15:58:17
    Permalink

    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

    Válasz
  • 2008. április 24. at 16:22:52
    Permalink

    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?

    Válasz
  • 2008. április 24. at 16:37:26
    Permalink

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

    Válasz
  • 2008. április 24. at 17:12:09
    Permalink

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

    Válasz
  • 2008. április 24. at 17:23:13
    Permalink

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

    Válasz
  • 2008. április 24. at 17:51:02
    Permalink

    Ó, 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!

    Válasz
  • 2008. április 29. at 00:30:42
    Permalink

    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?

    Válasz
  • 2008. április 29. at 09:07:18
    Permalink

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

    Válasz
  • 2008. május 16. at 13:23:04
    Permalink

    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.

    Válasz
  • 2008. május 16. at 13:37:16
    Permalink

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

    Válasz
  • 2008. május 16. at 14:54:11
    Permalink

    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?

    Válasz
  • 2008. május 16. at 15:11:06
    Permalink

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

    Válasz
  • 2008. május 16. at 15:24:53
    Permalink

    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.

    Válasz
  • 2008. május 16. at 15:31:33
    Permalink

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

    Válasz
  • 2008. május 16. at 15:42:12
    Permalink

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

    Válasz
  • 2008. május 22. at 23:32:03
    Permalink

    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.

    Válasz
  • 2008. május 22. at 23:35:45
    Permalink

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

    Válasz
  • 2008. május 23. at 10:54:04
    Permalink

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

    Válasz
  • 2008. május 23. at 12:00:14
    Permalink

    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.

    Válasz
  • 2008. május 23. at 12:14:04
    Permalink

    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.

    Válasz
  • 2008. május 23. at 12:57:02
    Permalink

    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

    Válasz
  • 2008. május 23. at 14:02:49
    Permalink

    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.

    Válasz
  • 2008. május 23. at 18:48:55
    Permalink

    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?

    Válasz
  • 2008. május 23. at 19:22:56
    Permalink

    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.

    Válasz
  • 2008. május 23. at 20:32:16
    Permalink

    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

    Válasz
  • 2008. május 23. at 20:35:23
    Permalink

    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

    Válasz
  • 2008. május 23. at 20:43:31
    Permalink

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

    Válasz
  • 2008. május 26. at 19:52:51
    Permalink

    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?

    Válasz
  • 2008. május 26. at 20:02:17
    Permalink

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

    Válasz
  • 2008. május 26. at 21:01:58
    Permalink

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

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

    Válasz
  • 2008. május 26. at 21:19:19
    Permalink

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

    Válasz
  • 2008. július 18. at 13:31:52
    Permalink

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

    Válasz
  • 2008. július 18. at 13:34:44
    Permalink

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

    Válasz
  • 2008. július 19. at 08:50:13
    Permalink

    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

    Válasz
  • 2008. július 19. at 08:56:23
    Permalink

    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.

    Válasz
  • 2008. július 19. at 08:58:51
    Permalink

    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.

    Válasz
  • 2008. július 19. at 09:46:44
    Permalink

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

    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