Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Problem z nice URLs (mod_rewrite)
Forum PHP.pl > Forum > PHP
Hubson
Postanowiłem przerobić odnośniki na swojej witrynie do nowej postaci - przyjaznych URL -i. Uprzednio przeczytałem kilka artykułów na ten temat w necie. Stworzyłem odnośniki w oparciu o moduł przepisujący je, dostępny w Apache. Tak więc utworzyłem odpowiednie reguły w pliku .htaccess, tj.:
Cytat(".htaccess")
RewriteEngine on
RewriteRule ^(.*).html$ index.php?dzial=$1 [NC]
RewriteRule ^/(.*)/(.*)/([0-9]{1,10})/(.*).html$ index.php?dzial=$1&akcja=$2&obiekt=$3&tytul=$4 [NC]

Potem listę odnośników:
  1. <ul id="menu">
  2. <li> <a href="index.html">Index</a> </li>
  3. <li> <a href="aktualnosci.html">Aktualności</a> </li>
  4. <li> <a href="artykuly.html">Artykuły</a> </li>
  5. [...]
  6. </ul>

Na tym etapie, przy wchodzeniu do każdego działu wszystko było OK. Postanowiłem więc przerabiać po kolei poszczególne moduły mojej strony. Pod pierwszy ogień poszły aktualności... i tutaj pojawił się problem. Mianowicie wziąłem się za implementację przyjaznych URL -i do komentarzy. Pod każdym newsem mam SPAN-a, który prowadzi do listy komentarzy, postanowiłem więc stworzyć link o takiej postaci:
  1. <a href="aktualnosci/komentarze/1/Tytul-newsa.html">Komentarze (5)</a>

ku mojemu zdziwieniu odnośnik nie zadziałał, tak jak jego odpowiednik:
  1. <a href="index.php?dzial=aktualnosci&akcja=komentarze&obiekt=1&tytul=Tytul-newsa">Komentarze (5)</a>

Zacząłem sprawdzać co jest nie halo i dodałem następującą linijkę kodu do głównego pliku strony - index.php:
  1. <?php print_r($_GET); ?>

Wydrukował on zawartość wszystkich zmiennych w tablicy $_GET i ku mojemu zdziwieniu pojawiła się tylko jedna - dzial:
Cytat
Array ( [dzial] => aktualnosci/komentarze/1/Tytul-newsa)

Zaobserwowałem także inny problem. Po wejściu na wskazaną witrynę załadowała się strona główna serwisu (warunek default w instrukcji switch{} do zmiennej $_GET['dzial']), a do każdego odnośnika w menu dodało się (przykład dla index -a ):
Cytat
/aktualnosci/komentarze/1/index.html

podczas gdy w kodzie wszystko wyglądało ok (tak jak na początku postu).

Reasumując, proszę o pomoc, czy mógłby mi ktoś powiedzieć co robię źle i poradzić jak z tego błędu wybrnąć?
Z góry dziękuję i pozdrawiam.
NuLL
Taki maly tip - zauwazyc ze ten dlugi ciag ktory podajesz pasuje do pierwszego prega - moze lepiej zmienic (.*) na cos innego ? smile.gif
Hubson
Próbowałem też z: ([^-]*), ale także nie działało sad.gif... Co radzisz?
hzl_91
zobacz tak:
Cytat
RewriteRule ^/([^-]*)/([^-]*)/([^-]*)/([^-]*)\.html$ ./index.php?dzial=$1&akcja=$2&obiekt=$3&tytul=$4 [L,QSA]


Powinno działać.
Hubson
Niestety nie działa sad.gif, nadal to samo:
Cytat
Array ( [dzial] => aktualnosci/komentarze/1/Tytul-newsa )
hzl_91
Moje .htaccess jest na 100% dobrze, tak mi się zdaje. Musisz mieć błąd w skrypcie.

A odpowiednik działa?
Hubson
Mój skrypt też jest w 100% dobrze, skoro działa z linkiem w tej postaci:
  1. <a href="index.php?dzial=aktualnosci&akcja=komentarze&obiekt=1&tytul=Tytul-newsa">Komentarze (5)</a>

Tylko dlaczego w przypadku przyjaznych URL -i widzi tylko jedną zmienną przekazywaną przez adres?
hzl_91
A te aktualności.html itepe działa?
Hubson
Tak, nic nie zmieniło się od tego co napisałem w pierwszym poście... prócz zawartości pliku .htaccess - zmiana reguły na tą, którą podałeś.
hzl_91
robisz to na localu, czy na serwerze?
Hubson
Na localhoście.
hzl_91
A spróbuj jeszcze tak:
Cytat
RewriteRule ^([^-]*)/([^-]*)/([^-]*)/([^-]*)\.html$ ./index.php?dzial=$1&akcja=$2&obiekt=$3&tytul=$4 [L,QSA]
Hubson
Niestety nadal to samo... ;(
hzl_91
A moze tak:
Cytat
RewriteRule ^([^-]*)/([^-]*)/([0-9]+)/([^-]*)\.html$ ./index.php?dzial=$1&akcja=$2&obiekt=$3&tytul=$4 [L,QSA]


Ale się wkurzyłem ^^ muszę to zrobić tongue.gif
Hubson
Nadal to samo, czyt. nie działa.
Cytat(hzl_91 @ 31.12.2006, 10:33:25 ) *
Ale się wkurzyłem ^^ muszę to zrobić tongue.gif

Też tak sobie postanowiłem wczoraj... po czym dzisiaj wylądowałem tutaj guitar.gif.
hzl_91
A zobacz tak
Cytat
RewriteRule ^aktualnosci/([^-]*)/([0-9]+)/([^-]*)\.html$ ./index.php?dzial=aktualnosci&akcja=$2&obiekt=$3&tytul=$4 [L,QSA]


może nie jest przekazywana zmienna działu.
Hubson
W tym problem, że tylko ta zmienna jest przekazywana.
Cytat
Array ( [dzial] => aktualnosci/komentarze/1/Tytul-newsa )
hzl_91
A mógł byś pokazać plik, który generuje tego linka.
Hubson
To jest skrypt aktualności i trochę tego kodu jest, pokażę Ci jedną linijkę smile.gif odpowiedzialną za wygenerowanie odnośnika :]:
  1. <?php
  2. echo '<a href="aktualnosci/komentarze/'.$index[0].'/'.usunpl($index[1]).'.html">Komentarze ('.$liczba_kom.')</a>';
  3. ?>

W razie jakichkolwiek pytań, funkcja usunpl() usuwa ze stringa polskie fonty i przerabia je na odpowiedniki zwykłych literek 'ś' => 's' itd... ale nie wiem po co Ci to było.
Balas
Kod
RewriteEngine on
RewriteRule ^(.*).html$ index.php?dzial=$1 [NC]
RewriteRule ^/(.*)/(.*)/([0-9]{1,10})/(.*).html$ index.php?dzial=$1&akcja=$2&obiekt=$3&tytul=$4 [NC]

Czy czasem te 2 reguly sie nie wykluczaja?
Hubson
Dlaczego?
Jedna tyczy się jednej zmiennej, druga trzech. Jednakże nie wiem dlaczego nie działają. Jakieś pomysly?
Balas
Kod
aktualnosci/komentarze/1/Tytul-newsa.html

to rowniez (chyba) pasuje do pierwszej reguly wiec nie dziw sie, ze wdg niej leci winksmiley.jpg

a probowales zostawic tylko
Kod
RewriteRule ^/(.*)/(.*)/([0-9]{1,10})/(.*).html$ index.php?dzial=$1&akcja=$2&obiekt=$3&tytul=$4 [NC]
?
Hubson
Jasne, ale wyświetla stronę 404 (serwera) przy odpalaniu... a poza tym nie działa poprzednia strona aktualnosci.html (1 reguła) sad.gif. Problem chyba nie do rozwiązania...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.