ugrás a tartalomhoz

Rövid URL-t nem a htaccess oldja fel, hanem automatikusan kiterjesztést kap

tisch.david · 2009. Jún. 16. (K), 09.46
Sziasztok!

$SUBJECT témában kérnék segítséget. Apache-ban a rewrite modul engedélyezve van, a document root-ban pedig ott van az alábbi .htaccess:
  1. RewriteEngine On  
  2.   
  3. RewriteRule ^(\w+)/([0-9]+)$ /site/$1.php?id=$2  
A htaccess értelmezése megtörténik, mert ha elrontom, akkor sír érte az Apache. A feloldást mégsem ő végzi, mert ha a szabály jobb oldalán hülyeséget írok, akkor sem történik semmi; mindig automatikusan a document root-ban lévő, azonos nevű de .php kiterjesztésű állomány fut le, de GET-ben semmi paraméter nem jön.

A document root-hoz tartozó virtual host beállítás az alábbi:
  1. Options Includes FollowSymLinks MultiViews  
  2. AllowOverride All  
  3. Order allow,deny  
  4. Allow from all  
Minden segítséget, linket és keresőszót köszönök!

Üdv:
Dávid
 
1

^

duplabe · 2009. Jún. 16. (K), 12.01
^(\w+)/([0-9]+)$

ez a szabály arra illeszkedik pl, hogy kutya/23

de az url-ben lényegesen több dolog van: http://atedomained/ittislehetmegsokminden/kutya/23
mivel a szabály elején ott van a ^ emiatt nem is illeszkedik. azt le kéne szedni az elejéről.

szerk:
hülyeséget írtam, bár nem teljesen :) nem az egész url-t kapja meg, viszont van egy / az elején, tehát ebben az esetben (http://atedomained/ittislehetmegsokminden/kutya/23) ezt: /ittislehetmegsokminden/kutya/23

Akkor a szabály így lenne jó: ^/(\w+)/([0-9]+)$
2

Nem hiányzik a végéről egy

Tanul0 · 2009. Jún. 16. (K), 12.26
Nem hiányzik a végéről egy [L,QSA]??? vagy azt csak nem írtad ki?
3

rerite log

vbence · 2009. Jún. 16. (K), 13.00
A rewrite szabályok debugolásánál mindig segítségül hívhatod a megfelelő logot (persze ha be van kapcsolva ez a funkció). Megfelelően bőbeszédű beállításoknál egyetlen kérés alapján kiderülhet a hiba oka.
4

RewriteLogLevel 2 RewriteLog

Tanul0 · 2009. Jún. 16. (K), 13.06
RewriteLogLevel 2
RewriteLog /path/to/log/rewrite.log

Szerintem ennyi elég, ebben minden benne lesz.
5

Furcsán illeszkedő szabály

tisch.david · 2009. Jún. 16. (K), 14.02
Sziasztok!

Köszi a tippeket! Apache 2-ről lévén szó, a / nem kell a szabályok elejére, az [L] azonban tényleg hiányzott a végéről, ezért odaírtam. A .htaccess most így néz ki:
  1. RewriteEngine On  
  2.   
  3. RewriteRule ^(\w+)$ /site/$1.php [L]  
  4. RewriteRule ^(\w+)/([0-9]+)$ /site/$1.php?id=$2 [L]  
  5. RewriteRule ^(\w+)/([0-9]+)/([0-9]+)$ /site/$1.php?id=$1&page=$2 [L]  
Meg is logoltattam, ami alapján úgy tűnik, hogy a http://domain/category/200/1 linket a /site/200.php?id=1 címre akarja átírni. Nem igazán vágom, hogy erre miért nem a 3. szabály illeszkedik... Mit nem veszek észre?

Köszi előre és utólag is:

Dávid
6

itt egy kis példa, hogy

Tanul0 · 2009. Jún. 16. (K), 14.30
itt egy kis példa, hogy hogyan lehet megoldani a sok paramétert tartalmazó linkek rövid változatát:
  1. RewriteRule ^0(;(.*))?$ forum.php?rewrite=$2 [L,QSA]  
  2.   
  3. RewriteRule ^([0-9]+)(;(.*))?$ forum.php?req=thread&id=$1&rewrite=$3 [L,QSA]  
  4.   
  5. RewriteRule ^([0-9]+),(-?[0-9]+)(;(.*))?$ forum.php?req=thread&id=$1&page=$2&rewrite=$4 [L,QSA]  
  6.   
  7. RewriteRule ^f\.([0-9]+)(;(.*))?$ forum.php?req=main&id=$1&rewrite=$3 [L,QSA]  
  8.   
  9. RewriteRule ^t\.([0-9]+)(;(.*))?$ forum.php?req=thread&id=$1&rewrite=$3 [L,QSA]  
  10.   
  11. RewriteRule ^p\.([0-9]+)(;(.*))?$ forum.php?req=thread&postid=$1&rewrite=$3 [L,QSA]  
  12.   
  13. RewriteRule ^u\.([0-9]+)(;(.*))?$ forum.php?req=cp&id=$1&rewrite=$3 [L,QSA]  
  14.   
  15. RewriteRule ^s\.(.*) forum.php?req=search&InSubject=1&InMessage=1&Query=$1 [L,QSA]  
  16.   
  17. End OLD declarations  
  18.   
  19. RewriteRule ^forum/([0-9]+)[^;]*(;(.*))?$ forum.php?req=main&id=$1&rewrite=$3 [L,QSA]  
  20.   
  21. RewriteRule ^thread/([0-9]+),(-?[0-9]+)[^;]*(;(.*))?$ forum.php?req=thread&id=$1&page=$2&rewrite=$4 [L,QSA]  
  22.   
  23. RewriteRule ^thread/([0-9]+)[^;]*(;(.*))?$ forum.php?req=thread&id=$1&rewrite=$3 [L,QSA]  
  24.   
  25. RewriteRule ^post/([0-9]+)[^;]*(;(.*))?$ forum.php?req=thread&postid=$1&rewrite=$3 [L,QSA]  
  26.   
  27. RewriteRule ^user/([0-9]+)[^;]*(;(.*))?$ forum.php?req=cp&id=$1&rewrite=$3 [L,QSA]  
  28.   
  29. RewriteRule ^search/(.*) forum.php?req=search&InSubject=1&InMessage=1&Query=$1 [L,QSA]  
  30.   
  31. RewriteRule ^unread(;(.*))?$ forum.php?req=search&nodef=1&Special=unread&ResultView=1&rewrite=$2 [L,QSA]  
  32.   
  33. RewriteRule ^new(;(.*))?$ forum.php?req=search&nodef=1&Special=new&ResultView=1rewrite=&$2 [L,QSA]  
  34.   
  35. RewriteRule ^mytopics(;(.*))?$ forum.php?req=search&nodef=1&Special=mytopics&ResultView=1rewrite=&$2 [L,QSA]  
  36.   
  37. RewriteRule ^cp(;(.*))?$ forum.php?req=cp&item=1&rewrite=$2 [L,QSA]  
  38.   
  39. RewriteRule ^users(;(.*))?$ forum.php?req=users&rewrite=$2 [L,QSA]  
  40.   
  41. RewriteRule ^search(;(.*))?$ forum.php?req=search&rewrite=$2 [L,QSA]  
  42. RewriteRule ^stat(;(.*))?$ forum.php?req=stat&rewrite=$2 [L,QSA]  
  43.   
  44. RewriteRule ^forum(;(.*))?$ forum.php?req=main&rewrite=$2 [L,QSA]  
Vagy, ajánlom figyelmedbe a switch használatát:
  1. $oldal = explode('/',$_GET['oldal']);    
  2.      
  3.  switch($oldal[0])    
  4.   {    
  5.    case 'forum':    
  6.     if (isset($oldal[1])){ //megvizsgáljuk, hogy van-e megadva konkrét forum az URL-ben    
  7.      //megjelenítjük a konkrét hírt ($oldal[1]-ben lesz a forum ID-je, vagy neve)    
  8.      $forum=$oldal[1];}  
  9.     else echo "nincs";   
  10.  //megjelenítjük mondjuk az utolsó x darab hírt    
  11.     if(isset($oldal[2]))  
  12.     {  
  13.     $temaid=$oldal[2];  
  14.     }else echo "nincs";  
  15.       
  16.   
  17.   break;   
  18.   };  
  19.     if(!isset($oldal[0])) $oldal[0]="hirek";  
  20.       $invalide = array('/','/\/',':','.');  
  21.       $oldal[0] = str_replace($invalide,' ',$oldal[0]);  
  22.       if(!file_exists($oldal[0].".php")) $oldal[0] = "hirek";  
  23.       include($oldal[0].".php");  
7

Vissza az elejére

tisch.david · 2009. Jún. 16. (K), 15.27
Sziasztok!

Tovább teszteltem a .htaccess-t, és úgy tűnik, hogy a http://domain/bla/200/1 -et valóban a .htaccess dolgozza föl, méghozzá jól (szól az Apache, hogy nincsen bla.php), de ha bla helyett olyan megnevezés áll (pl. category vagy main), amilyen - .php kiterjesztéssel - létezik a document root-ban, akkor egyszerűen az kapja meg a vezérlést, és kész. Be lehet valahol állítani a httpd.conf-ban, hogy rewrite rule nélkül a http://domain/main esetén a main.php ne kapja meg automatikusan a vezérlést?

Köszi! Üdv:

Dávid
9

MultiViews

vbence · 2009. Jún. 16. (K), 16.08
Te kapcsoltab be...
10

Hogyaza...

tisch.david · 2009. Jún. 16. (K), 22.44
Hálás köszönet! Ő volt a ludas.

Üdv:
Dávid