címkék

beleszóltak

amik jók

Ricsi megmondja:
java'nother blog

Ebben hiszek:
BMWfanatics.hu

Beszédes URL-ek .htaccess, mod_rewrite azaz a rewrite engine ereje 1.

2008.01.23. 22:18 nullstring

már itt: http://blog.rhodeus.hu/2008/01/beszedes-url-ek-htaccess-modrewrite_23.html

30 komment

Címkék: php tutorial apache howto htaccess rewrite

A bejegyzés trackback címe:

https://nullstring.blog.hu/api/trackback/id/tr46309310

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Derk 2008.07.20. 15:55:10

Szia!

Lenne egy kérdésem.

A # jelet nem veszi figyelembe a linkben.

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

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

nullstring · http://www.bmwfanatics.hu 2008.07.20. 16:57:25

próbáld meg így:
[L,NE]

Bár nem tudom mit jelent pontosan a "nem veszi figyelembe" :)

Derk 2008.07.21. 12:52:23

Szia!

Nem működik így se. Azt jelenti, hogy nem veszi figyelembe, hogy minden tökéletesen működik, csak nem ugrik a lap közepére.
Gondolom az lehet a gond, hogy a # karaktert használjuk kommentezésre is.

Van esetleg valami más ötleted?

nullstring · http://www.bmwfanatics.hu 2008.07.22. 16:55:15

Szia,

Bevallom, megfogtál, sose próbáltam még anchor-t használni rule-ban.
A gondolatom az, hogy az anchor az egy kliens oldalon értelmezett dolog, amit nem tudsz elküldeni a szervernek http protokolon keresztül.
Ebben megerősített más is, megkérdeztem neked, mert nem akartam hülyeséget mondani.

Persze ez még nem jelenti azt, hogy erre igyál mérget.. bár azt tudnod kell, hogy semmire nem szoktam azt mondani, hogy nem lehet, azt mondja más, aki látta már, hogy a föld nem lapos ;)

freakjester 2008.10.29. 15:04:22

sziasztok!
lenne egy kérdésem.
A következő módon szépen működik a dolog: www.valamihu/tagok/bela
ezzel egy mysql táblábol ki is nyertem 'bela' adatait. nekem viszont az lenne célom hogy 'www.valami.hu/bela' beírásával is működjön, de ugyanakkor ha nem írunk be semmit rendesen hozza be a főoldalt...
ezt hogyan oldhatnám meg?

nullstring · http://www.bmwfanatics.hu 2008.10.29. 18:19:20

Ez már routing probléma. A rendszeredet alakítsd ki úgy, hogy ha egy 404-es oldalt kapsz, akkor előbb nézze meg, hogy van-e olyan usered, hogy bela, és csak akkor dobjon 404-et ha nincs. ha van, akkor ugyan az a szitu, mint a /tagok/bela esetén. Természetesen valamilyen módon nyilván kell tartanod a létező urljeidet, és a továbbiakban foglalkoznod kell az ütközések elkerülésével is, mert mi van, ha van egy olyan url-ed, hogy bela, ami valójában egy blog/fórum, akármi...

ncn 2008.11.14. 21:15:31

Üdv,

Végigolvastam a cikket és én is kedvet kaptam az url rewrite módszerhez.

El is készítettem az első .htaccess file-omat, de nem történt semmi. Sem 500-as error, sem 404-es.
Ez volt a file-ban:

Options +FollowSymLinks
RewriteEngine on

RewriteRule szemelyautok/tipus/(.*) szemelyautok.php?tipus=$1

Ez elvileg a szemelyautok.php?tipus=9-ből csinál
szemelyautok/tipus/9-et
De nekem nem működött, tudsz esetleg tippet adni, hogy mi lehet a gond?

köszi.

nullstring · http://www.bmwfanatics.hu 2008.11.14. 23:56:06

Szia,

Ez azért van, mert be van töltve apache-nak a
negotiation modul (httpd.apache.org/docs/2.0/mod/mod_negotiation.html), és az "Options"-ok között szerepel a MultiViews (httpd.apache.org/docs/2.0/mod/mod_negotiation.html#multiviews) opció.

Ez pusztán annyit csinál, hogy ha egy nem létező könyvtárra hivatkoznak, pl /szemelyautok/tipus, akkor nekiáll keresni egy ilyen fájlt: szemelyautok.*, és mivel megtalálja a php kiterjesztésű fájlodat, gyorsan lefuttatja azt. Ebben az esetben nem érvényesül a rewrite szabályod.

Egészítsd ki az első sorodat így:
Options +FollowSymLinks -MultiViews

Vagy változtass a szabályon/felépítésen :)

Sok sikert :)

ncn 2008.11.15. 09:49:35

1000 hála és köszönet. :D
Ez megoldotta a problémát.

NestQuick 2008.11.24. 11:04:11

Hello,

az lenne a problémám, hogy:
amikor megnyitom az általam kreált forumnak az egyik altémáját akkor, ezen lehet elérni:

valami.hu/forum/1/2/1
[oldalcime]/[forum_menüpont]/[téma]/[altéma]/[oldalszám]

ezzel nincs is gond, csak akkor jön a probléma, mikor a hirek menüpontot akarom elérni, akkor igy jön csak be:

valami.hu/news/0/0/0

de én ugy szeretném, ha nem kellene utána irni azokat, csak ha használni kell. Még kezdő vagyok a htaccess terén, ezért is kérem a segitséged.

itt van a htaccess fájl tartalma:


RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)/(.*)/(.*) index.php?rewrite=$1&id=$2&id2=$3&id3=$4 [QSA]



Előre is köszi.

nullstring · http://www.bmwfanatics.hu 2008.11.24. 12:15:39

Szia,

felesleges így szétbontanod a dolgot, mert mint tapasztaltad is, nem mindig van szükség az átadott értékekre.

Bőven elég az, amit a példában is írtam:

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

Ez után annyit teszel, hogy az átadot rewrite értéket explode-al szétbontod / jelek mentén:

$query = explode("/", $_GET["rewrite"]);

Ez után a modulod/menüpontod neve a $query tömb nulladik eleme lesz:

$module = $query[0]; // pl.: news

Aztán ha akarod, felhasználod a további elemeket, ha nem akkor nem.:

Ugyan ez fórum esetén:

$module = $query[0]; // forum
$topic = $query[1]; // tema
$subtopic = $query[2]; // altema
$page = $query[3]; // oldalszam

Értelem szerűen itt már csak rajtad múlik, hogy ellenőrizd az értékeket, hogy meg vannak-e adva, és dolgozz velük.

NestQuick 2008.11.25. 17:16:57

Óóóóhh, igy már világos..... Nagyon köszönöm

hrolcsi 2009.07.10. 12:41:41

Szia!

Csináltam a leírás alapján egy .htaccess fájlt, ami csak annyit tenne hogy minden kérést az index.php -nak ad. De csak félig működik.

Pl.:
1. localhost:800/teszt/ -> "teszt" értéket kapom
2. localhost:800/teszt/valami -> 404
3. localhost:800/teszt/akarmi -> 404
4. localhost:800/teszt/index/valami -> "teszt, index, valami" értékeket kapom.

a htaccess így néz ki:
RewriteEngine on
Options +FollowSymLinks -MultiViews
RewriteBase /

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

ehhez a php:
$URIParts = explode("/", $_SERVER['REQUEST_URI']);
foreach($URIParts as $f){
echo $f.'';
}

csak hogy lássam az értékeket.

A kérdésem az lenne hogy mért nem működik a 2-es 3-as példa. Mit rontottam el? Mit hagytam ki?

Előre is köszönöm a segítséget.

nullstring · http://www.bmwfanatics.hu 2009.07.14. 17:26:01

@hrolcsi: és ha úgy próbálod, ahogy a példában van?
nem $_SERVER['REQUEST_URI'] hanem $_GET['index'] (a rúlod alapján az index GET változóban kapod meg az uri mintát)?

hrolcsi 2009.07.17. 07:54:14

@nullstring: igen ott kellene de, valamiért nem jön létre a GET változó ezért használtam a REQUEST_URI -t.

De ha jól sejtem, akkor jelen esetben a $_SERVER['REQUEST_URI'] és a $_GET['index'] ugyanazt az értéket kapja.

Amit viszont nem értek, hogy miért kell az "index/" -t vagy az "index.php/" -t bele írni a címbe. A "-MultiViews" nem azért kell megadni hogy a létező nevű fájlokat/könyvtárakt ne vegye figyelembe?

nullstring · http://www.bmwfanatics.hu 2009.07.17. 08:01:10

@hrolcsi: Hajaj, kavarod a dolgokat :)

A $_SERVER['REQUEST_URI'] egyáltalán nem az, amire Te gndolsz, lesd csak meg: us2.php.net/manual/en/reserved.variables.server.php

Amire Te gondolsz, az maximum a $_REQUEST tömb, ami magába foglalja a GET és a POST változókat is. Ha nem jött létre GET, akkor lehet, hogy a register_globals-nál van egy kis problémád a php.ini-ben: us2.php.net/manual/en/security.globals.php
És értelemszerűen ebben az esetben semmi köze ennek a MultiViews-hez :)

hrolcsi 2009.07.17. 09:15:23

@nullstring: Sikerült! Köszönöm!

Ugyan nem a $_SERVER['REQUEST_URI'] és a $_GET['index'] eltérése okozta a problémát, hanem a "RewriteBase /" helyett "RewriteBase /teszt/" kell.

localhost-os témában mindig ilyenekbe futok bele:)

Control 2010.02.23. 08:29:24

Szia!

Most ismerkedem a .htaccess-el és szeretnék egy url-t átalakíttatni, de sajna valamiért nem sikerül.
Volna egyszer egy ilyen egyszerű szabály:
RewriteRule olaszorszag/hazak.html orszag.php?country=it
RewriteRule olaszorszag/ orszag.php?country=it
RewriteRule olaszorszag orszag.php?country=it

Ez még működik is csak, ha szeretnék mégegy ilyen szabályt, hogy:
RewriteRule olaszorszag/toszkana/hazak.html orszag.php?country=it&regio=tk

Ennél a második paramétert már nem veszi figyelembe :(
Remélem mindent leírtam ami kellhet...

Tudnál nekem ebben segíteni?
Válaszodat előre is köszönöm!

Lalicsiga 2010.05.01. 14:24:45

Hali, nekem mindig az url-ben lévő mappában lévő css filet akarja betölteni, de mivel nem létezik ilyen, nincs az oldal megformázva.Mi a teendő ilyenkor?

Dzéta P 2010.06.30. 20:04:13

Hali,

az miért van hogy csak az include-old fájl tartalmát jeleníti meg a böngésző, a 'szülő' index.php -t nem?

windows serveren megy gond nélkül, de linux serveren nem,

pl. valami.hu/kapcsolat esetén megjelenik a form magában, de az index.php-ban kialakított oldal szerkezet nem

köszi

pharma · http://www.nathadoktor.hu/ 2010.09.04. 18:25:10

Üdv!

Segítségre lenne szükségem.

.htaccess tartalma:

Options +FollowSymlinks
RewriteEngine on

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

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

Ha azt írom a címsorba, hogy

www.domain.hu/natha-megelozese/immunerosites/

minden O.K. A rewrite változóba natha-megelozese/immunerosites kitétel kerül.

Ha azt írom a címsorba, hogy

www.domain.hu/natha-megelozese/immunerosites

akkor a rewrite változóba csak a natha-megerositese kerül. /immunerosites kitetel lemarad a végéről.

Köcce előre is s egítséget!!

pharma · http://www.nathadoktor.hu/ 2010.09.04. 19:20:17

Hááhááá! Ezt nem fogjátok elhinni!

localhost/00-Weboldalak/domain

localhost/00-Weboldalak/domain/natha-megelozese/immunerosites/

<link rel="stylesheet" type="text/css" href="../../style/style.css" />

<link rel="stylesheet" type="text/css" href="style/style.css" />

Ezek a stíluslap hivatkozások kellenek egyszerre, mert különben vagy az egyik vagy a másik hivatkozás esetében nem formázza az oldalt!! :D

Én kész vok... 5let?

pharma · http://www.nathadoktor.hu/ 2010.09.04. 19:23:55

@Lalicsiga: Egy megoldás én pupák: abszolút hivatkozás:

localhost/00-Weboldalak/domain/style/style.css

pharma · http://www.nathadoktor.hu/ 2010.09.09. 20:18:35

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

Az hogy lehet, ha abszolút linkkel megoldon a külső stílulap problémáját és a két RewriteCond sort kitörlöm, nem lesz formázva az oldal még absz. css mellett sem?

pharma · http://www.nathadoktor.hu/ 2011.04.19. 11:34:35

Nekem sikerált minden, sőt kicsit továb fejlesztettem a dolgokat. Akit érdekel írjon nyugodtan! :)

pharma · http://www.nathadoktor.hu/ 2011.05.27. 23:12:39

Hát eléggé elhagyatott a téma :)

Nihil 2011.10.16. 14:42:56

@dr_pharma: Hello, engem érdekelne, hogy miképp módosított és mit a működés érdekében?
üdv!

waszil 2011.12.24. 16:36:45

Üdv!
A tárhelyemen egy almappában próbáltam ki a módszert:
www.domainneve.hu/teszt
A .htaccess file-ban pontosan ugyanaz van, mint amit itt találtam.
A /teszt mappában van az index.php, ahol annyi történik, hogy kiítom a rewrite értékét:
echo $_GET["rewrite"];
Ez működik is, ahogy kell.
A mappa tartalma egyébként ennyi:
- .htaccess
- index.php
- kep.gif
A problémám a következő: Az index.php-ban van egy kis html rész, ahol a kép van beillesztve:
<img src="kep.gif">
Namost ha a címsorba csak egy plusz paramétert írok, még szépen működik a dolog (pl.: www.domainneve.hu/teszt/akarmi), de ha ennél többet, akkor a kép nem jelenik meg, mintha másik mappában állna. A rewrite változó kiírása viszont ekkor is tökéletes: www.domainneve.hu/teszt/akarmi/barmi/valami
$rewrite = "akarmi/barmi/valami"

Van ötlet, hogy a kép miért nem jelenik meg?
Köszi, és boldog Karácsonyt!

waszil 2011.12.24. 16:37:58

@waszil: Ja, és igen, mielőtt kérdés lenne, a RewriteBase is jó:
RewriteBase /teszt/