Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [inne]Ładne linki w .htaccess - złe dopasowywanie, Jak stworzyć ładne linki?
milons
post
Post #1





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 29.06.2011

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
artuross
post
Post #2





Grupa: Zarejestrowani
Postów: 164
Pomógł: 9
Dołączył: 30.12.2011

Ostrzeżenie: (0%)
-----


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.

Ten post edytował artuross 30.03.2013, 17:24:31


--------------------
Pomoglem? Daj pomogl!
Go to the top of the page
+Quote Post
milons
post
Post #3





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 29.06.2011

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
artuross
post
Post #4





Grupa: Zarejestrowani
Postów: 164
Pomógł: 9
Dołączył: 30.12.2011

Ostrzeżenie: (0%)
-----


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.

Ten post edytował artuross 30.03.2013, 17:17:22


--------------------
Pomoglem? Daj pomogl!
Go to the top of the page
+Quote Post
milons
post
Post #5





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 29.06.2011

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
artuross
post
Post #6





Grupa: Zarejestrowani
Postów: 164
Pomógł: 9
Dołączył: 30.12.2011

Ostrzeżenie: (0%)
-----


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.

Ten post edytował artuross 30.03.2013, 17:24:14


--------------------
Pomoglem? Daj pomogl!
Go to the top of the page
+Quote Post
milons
post
Post #7





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 29.06.2011

Ostrzeżenie: (0%)
-----


Moglbys napisac dla mnie zalazek takiego czegos? smile.gif
Go to the top of the page
+Quote Post
artuross
post
Post #8





Grupa: Zarejestrowani
Postów: 164
Pomógł: 9
Dołączył: 30.12.2011

Ostrzeżenie: (0%)
-----


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


Ten post edytował artuross 30.03.2013, 17:31:21


--------------------
Pomoglem? Daj pomogl!
Go to the top of the page
+Quote Post
milons
post
Post #9





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 29.06.2011

Ostrzeżenie: (0%)
-----


Ok to wiem. Ale do pytania z pierwszego postu. Dlaczego zle zostaje dopasowany link?
Go to the top of the page
+Quote Post
artuross
post
Post #10





Grupa: Zarejestrowani
Postów: 164
Pomógł: 9
Dołączył: 30.12.2011

Ostrzeżenie: (0%)
-----


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.


Ten post edytował artuross 30.03.2013, 17:49:49


--------------------
Pomoglem? Daj pomogl!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 06:27