ugrás a tartalomhoz

Rewrite szabály, hogy minden kérést az index.php szolgáljon ki

Gully Foyle · 2008. Jan. 19. (Szo), 12.50
Sziasztok!

Mit kell beírnom a .htacces fájlba, hogy minden kérést pl. az index.php dolgozzon fel (az alkönyvtárakban is)? Többek között azt szeretném elérni, hogy ne lehessen a böngészőben visszafelé lépkedni. Ha az URL nem kerülne kiírásra, az még jobb lenne.

Válaszaitokat előre is köszönöm.
 
1

RewriteRule . /index.php [L]

Török Gábor · 2008. Jan. 19. (Szo), 13.48
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Ha tényleg mindent (így statikus állományok) az index.php-n keresztül szeretnél kiszolgálni, akkor a két RewriteCond szabályt hagyd el.

Azt ne akard, hogy a history-t letiltod, mert a látogatóid sem fogják akarni. Az URL elrejtésről pedig annyit, hogyha a postaládád letakarod a szomszéd elől, a postás sem fog levelet hozni.
2

Miért, miért, miért?

vbence · 2008. Jan. 19. (Szo), 13.56
Ez egy olyan kérdés, ahol inkább a problémát kellett volna leírnod, hogy ajánlhassunk alternatív megoldásokat. Az általad leírt dolog kivitelezhető, de nemigen találkozol vele a neten, és valószínűleg okkal nem.

A kérdésre visszatérve: nincs szükség htaccess-re a megoldáshoz. Amit védeni szeretnél (gondolom) az nem a statikus tartalom (képek), hanem a generált oldalak. (Persze lehet, hogy tévedek). Ha egy URLről szeretnéd elérni az összes tartalmat, akkor a klienstől kapott url-re nem hagyatkozhatsz. Az index.php-d olvashatná a session-ből az elküldendő file nevét. A session-be pedig egy másik php állítaná be pl:

A főoldal (amit az index.php generál):

...
<a href="setter.php?page=valami.html&md5=1f3870be274f6c49b3e31a0c6728957f">Valami</a>
Ha rákattint a linkre, a session-ben átíródik a page változó "valami.html"-re. (Az md5-ről később). A setter.php azután, hogy megtette a session-ben a kívánt változásokat egy 302-es (átmeneti) átirányítássalvisszaugrik az index.php-re.

Az index.php kiveszi a session-ből a "page" változót, és elküldi a kliensnek a kívánt fájlt. Így minden tartalom URL-je az index.php lett. A küldés közben a HTML fájl linkjeit átírhatjuk ezekre a setter.php-s linkekre, így egy transzparens védelmi réteget kapunk, a fájloknak semmit sem kell tudniuk róla.

Az md5-tel lényegében láírod a linkeket. A session-ben lehet egy "counter" változó is, ami mindig növekszik eggyel. Az md5 a kívánt page érték plusz a counter értéke md5-özve. Így nem használatja fel újra a korábban megszerzett url-eket, hiszen az már nem stimmelne a counterrel.
3

mi célt is szolgálna mindez?

Gully Foyle · 2008. Jan. 19. (Szo), 14.23
Először is köszönöm a válaszaitokat. Valóban nem részleteztem, hogy mit is szeretnék elérni, most pótolom:

Egy korábban - főként gyakorlási szándékkal - írt szoftveremet szeretném továbbfejleszteni. A célok nagyjából ezek:

- ne lehessen visszalépkedni (pl. a post-olt adatok se kerüljenek így újra küldésre)
- ne tehesse meg a user, hogy kézzel beírja a linket, és így olyan funkciót futasson, amihez bár van jogosultsága, de az adott helyről nem kéne lefutnia (pl.: a bejegyzes_megtekintes.php csak a bejegyzes.lista.php-ből fusson le a megfelelő linkre kattintva)
4

Referer check

vbence · 2008. Jan. 19. (Szo), 14.28
A kézzel történő beírás ellen véd, ha ellenőrzöd a referer-t (ezt megteheted htaccessbpl is). Persze ha valaki speciális klienst használ, a referer-t bármire állíthetja, tehát a rosszhiszemű felhasználók ellen nem véd.
5

Post

janoszen · 2008. Jan. 19. (Szo), 14.55
A postolt adatok újra beküldését nagyon egyszerűen ki tudod kerülni. Azon az oldalon, amin feldolgozod, nem adsz ki kimenetet, hanem egy location header-rel azonnal továbbdobod a felhasználót. Ha pedig a kényes funkciókat post-tal küldöd be, megoldottad a második problémát is.
6

php fileok védelme?

winston · 2008. Jan. 19. (Szo), 15.08
a bejegyzes_megtekintes.php csak a bejegyzes.lista.php-ből fusson le a megfelelő linkre kattintva


lehet, hogy én értelmezem félre, de ebből ítélve arra gondolok, hogy te azt nem akarod, hogy a .php fájlaidat futtassák. legalábbis nem azt, amelyiket te nem szeretnéd. ha ez a helyzet, akkor a htaccess mégiscsak a barátod, méghozzá a nice url, rewrite mod környékén érdemes kapirgálni. (gyakorlatilag minden beérkező url-t átírsz, így az nem fog megfelelni a könyvtárstruktúrádnak, tehát nem éri el közvetlenül a .php filet)

kellemes hétvégét
8

a megfelelő linkre kattintva

vbence · 2008. Jan. 19. (Szo), 17.29
a megfelelő linkre kattintva


Ha jól értem, ő azt szeretné, hogy csak a kijelölt navigációs ösvényen lehessen haladni. (Nem azt, hogy egyáltalán ne lehessen egyes url-eket megnyitni).
11

ehh

winston · 2008. Jan. 19. (Szo), 17.44
ehh. akkor mea culpe. ajax force... és akkor végig egy url-en marad (talán a volán jegyrendelés van így, ha jól emlékszek)
7

Miért nem megy?

Gully Foyle · 2008. Jan. 19. (Szo), 17.29
Sajnos semmilyen hatása nincs a .htaccess file használatának. Időközben megnéztem jónéhány idevonatkozó dokumentumot, beállítottam a RewriteBase-t, az AllowOverride-ot All-ra állítottam, de nem akar működni. Más funkciók működnek a htaccess-ben, szóval nem értem.

Van még valami, amit be kellene állítani? (Localhost-on tesztelem mindezt, így mindenhez van hozzáférésem.)
9

mod_rewrite?

janoszen · 2008. Jan. 19. (Szo), 17.31
Egyáltalán be van kapcsolva a megfelelő modul? A mod_rewrite tudtommal nem minden telepítésben van alapból betöltve az Apache-ba!
10

IF

vbence · 2008. Jan. 19. (Szo), 17.33
Használod ezt a butaságot?
<IfModule mod_rewrite.c>
Mert ekkor ha nincs telepítve a mod_rewrite, akkor átugorja a konfigurációdat, és nem kapsz visszajelzést arról, hogy miért nem megy (ahogy meg is történt). Szedd ki az ifet, és talán röktön megmondja az apache, hogy ismeretlen direktíva a RewriteRule.
12

nincs hibaüzenet

Gully Foyle · 2008. Jan. 19. (Szo), 17.48
Be van kapcsolva a rewrite_module, nem ír ki semmilyen hibaüzenetet. Próbáltam a gyökér könyvtárba tenni a htaccess-t, próbáltam a megfelelő alkönyvtárba tenni a RewriteBase megadásával, továbbá kipróbáltam 10 féle egyébb beállítást, de eredmény az semmi.
13

log

vbence · 2008. Jan. 19. (Szo), 21.49
kapcsold be a rwrite logot, és nézz bele...
14

működik

Gully Foyle · 2008. Jan. 20. (V), 19.20
Végül sikerült működésre bírnom, minden segítő hozzászólást köszönök.
15

Mi volt?

janoszen · 2008. Jan. 20. (V), 19.22
Légyszi írd meg, mi volt a megoldás, hogy ha mások keresnek ilyesmit, okulhassanak belőle.
16

Már csak az a kérdés

vbence · 2008. Jan. 20. (V), 20.38
...hogy a szerveren belül történő átirányítás mennyiben oldja meg az eredeti problémát. Én nagyon gondolkodom, de nem értem :)
17

a mod_rewrite működik...

Gully Foyle · 2008. Jan. 21. (H), 15.58
... nem az eredeti problémák oldóttak meg. Valószínűleg a RewriteBase volt rosszul megadva.

Bár, ami tényleg fontos, azokra választ kaptam tőletek, többek közt a POST-olt adatok újraküldésének elkerülésére és a linkek védelmére.

Emellett járulékos haszonként megtanultam ezt-azt a .htaccess tényleges lehetőségeiről, így szép rövid URL-jeim lesznek és nem lesz igénytelen 404-es hibaoldalam. :)