Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inne]Ładne linki w .htaccess - złe dopasowywanie
Forum PHP.pl > Forum > Przedszkole
milons
Witam.

Chciałem na swojej małej stronie wprowadzić mechanizm ładnych linków, przyjaznych URL, czy jak to jeszcze można nazwać.

Chciałbym aby następująco były tłumaczone adresy:

example.com/cokolwiek -> example.com/index.php?page=cokolwiek
example.com/cokolwiek/ -> example.com/index.php?page=cokolwiek
example.com/article -> example.com/index.php?page=article?article=1
example.com/article/ -> example.com/index.php?page=article?article=1
example.com/article/jakis -> example.com/index.php?page=article?article=jakis
example.com/article/jakis/ -> example.com/index.php?page=article?article=jakis

Mój plik .htaccess wygląda aktualnie następująco:


Kod
RewriteRule ^article/(.+)/$ index.php?page=article&article=$1
RewriteRule ^article/(.+)$ index.php?page=article&article=$1
RewriteRule ^article/$ index.php?page=article&article=1
RewriteRule ^article$ index.php?page=article&article=1
RewriteRule ^(.+)/$ index.php?page=$1
RewriteRule ^(.+)$ index.php?page=$1




Przykład nie działa dla żadnego przypadku:
zawsze $_GET = Array ( [jeden] => index.php )

Gdy wykomentuję dwie ostatnie linijki, działa to dla podstron article w każdej kombinacji z powyższych.

Gdzie leży błąd w moim myśleniu?

Wiem że można ten plik wygenerować "ręcznie" dla każdego możliwego przypadku www.example.com/cokolwiek ale chciałbym oprzeć to na wyrażeniu regularnym.

Głupio mi prosić o gotowca, ale niestety nie potrafię sam rozwiązać tego problemu (wiem, że w necie jest pełno poradników, ale nadal coś w mojej głowie nie zaskoczyło)
artuross
Dzieje sie tak dlatego, ze Apache wykonuje nowe zapytanie dla kazdego rewrite, dodaj np. &rw=1 i sprawdzaj czy nie ma:

Kod
RewriteCond %{QUERY_STRING} !&rw=1$ [NC]

RewriteRule ^article/(.+)/?$ index.php?page=article&article=$1&rw=1
RewriteRule ^article/?$ index.php?page=article&article=1&rw=1
RewriteRule ^(.+)/$ index.php?page=$1&rw=1
RewriteRule ^(.+)$ index.php?page=$1&rw=1


Ten przykład jest bardzo prosty, poniewaz latwo go zlamac wpisujac &rw=1 na koncu, ale mozesz zrobic wiecej zapytan i np. dodac query_string jako pierwszy, a dopiero pozniej parametry przepisywane.
milons
Nie bardzo rozumiem na czym polega twoje rozwiazanie... Co ma dac mi zmienna dodana na koncu wyrazenia?

Jeszcze jedno pytanie - tak dla upewnienia.
Wszystkie te rewrite dotycza tylko adresow "na pasku" czy tez linkow w kodzie, odwolan do css czy obrazkow itd?
artuross
Milions, przedstawie Ci to "wizualnie".

1. Wpisujesz w pasku adresu http://example.com/przyklad
Zostaje wykonane zapytanie i serwer przechwytuje je, teraz serwer /przyklad przekierowuje na ?strona=przyklad, ale tak naprawde jest to zupelnie nowe zapytanie, dokladnie tak, jakbys w przegladarce sprobowal teraz wpisac http://example.com/?strona=przyklad.

Po prostu musisz powiedziec Apache, ze to jest przekierowanie, ktore on sam wykonal, dlatego dodalem te zmienne, zeby Apache wiedzial, ze teraz nie ma wykonywac przekierowania.

2. Dziala dla kazdego zapytania dla serwera, czyli CSS, HTML, JS i cokolwiek sobie wymarzysz.
milons
A wiec moj ptzyklad popsuje calkowicie szablon strony bo bede musial w ten sam sposob podlinkowac wsztskie .css itd? Czy mozna jakos wykluczyc css jpg gif etc etc?
artuross
Mozna, mozesz dodac warunki, ze request_filename musi konczyc sie inaczej niz .html lub .css itd., albo mozesz stworzyc taki warunek, ktory wykluczy wszystkie istniejace pliki.
EDIT, a jezeli mowisz o tych konkretnych, ktore Ty masz dodane, to psuja ostatnie 2 warunki.
milons
Moglbys napisac dla mnie zalazek takiego czegos? smile.gif
artuross
Czego dokladnie, bo podalem 2 opcje smile.gif

Jezeli chcesz zeby wykluczalo sciezki, ktore sa realnymi sciezkami do pliku to po prostu dodajesz
Kod
RewriteCond %{REQUEST_FILENAME} !-f
// a tutaj reszta
milons
Ok to wiem. Ale do pytania z pierwszego postu. Dlaczego zle zostaje dopasowany link?
artuross
Ehh, no pisalem, po prostu wykonuje sie kilka tych zapytan po raz kolejny, az wynikiem wyjsciowym jest index.php (poniewaz zostalo wykonane 5 zapytan, a chyba tyle jest maksem w podstawowej konfiguracji Apache). Po prostu musisz dodac jaki parametr konczacy. Sam ostatnio mialem z tym problem, wiec jestem pewien, ze podaje Ci poprawne informacje.

EDIT
Albo inaczej. U Ciebie jest cos takiego
Kod
RewriteRule ^(.+)$ index.php?page=$1

A teraz zobacz ciag zapytan dla /abc:
/abc -> index.php?page=/abc
index.php?page=/abc -> index.php?page=index.php?page=/abc
index.php?page=index.php?page=/abc -> index.php?page=index.php?page=index.php?page=/abc
itd., itd. az nadchodzi 5. przekierowanie, a wtedy Apache mowi dosc! Zrobilem juz 5 przekierowan, nie bedziesz mnie w jajo robil Ty zwykly, ziemski uzytkowniku.
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.