d.stp
20.04.2013, 21:27:54
Używam mod_rewrite do przyjaznych linków na swojej stronie, ale mam mały problem ponieważ wprowadziłem paginację wyników z bazy i nie wiem za bardzo jak mam się teraz odwołać do konkretnej strony w paginacji.
Mam np. taki url:
nazwa_strony.pl/artykuly/
I na tej podstronie wyświetlam wyniki z bazy, żeby przejść do następnej strony wyników muszę dodać parametr "p" do urla, ale jak dodam taki:
nazwa_strony.pl/artykuly/?p=3
to dalej pokazuje mi się strona 1, tak jakby nie czytało tego parametru...
Jak to ugryźć w htaccess? dodam, że nie chcę robić artykuly/1 itd., a raczej nie mogę, bo po wejściu w jakiś artykuł mam coś takiego w urlu:
artykuly/nazwa-artykulu/
A jak dam artykuly/1 to skrypt nie będzie wiedział czy to strona paginacji czy podstrona z artem ;/
amii
20.04.2013, 21:53:55
1. Czy twoja paginacja działa poprawnie a jeśli tak to jak wyglądają generowane URL-e ?
d.stp
20.04.2013, 21:59:53
Działa poprawnie, bo jak wchodzę normalnie bez mod_rewrite czyli bezpośrednio index.php?page=artykuly&p=1/2/3.. lub index.php?page=artykuly&id=nazwa-arta to wszystko działa tak jak powinno.
amii
20.04.2013, 22:16:57
RewriteRule ^artykuly/([0-9]+)$ index.php?page=artykuly&p=$1 [L,NC]
RewriteRule ^artykuly/?$ index.php?page=artykuly [L,NC]
No i wpisujesz linki:
nazwa_strony.pl/artykuly/
nazwa_strony.pl/artykuly/(0-9)
Jeśli regułki będą ułożone od szczegółu do ogółu to pierwszą będzie łapał dla linków z parametrem paginacji, jeśli takiej nie znajdzie to ewentualnie chwyci drugą.
EDIT: możesz jeszcze dopisać flagi L dla zwiększenia wydajności
d.stp
20.04.2013, 22:50:57
no właśnie tak nie działa, bo już tak próbowałem...
Mi chodzi raczej o coś takiego:
RewriteCond %{QUERY_STRING} ^p=([0-9]*)$ [NC]
ale nie wiem jak to do końca zmodyfikować pod moją stronę... nie znam się kompletnie na wyrażeniach regularnych
amii
20.04.2013, 23:03:00
Nie działa tzn. nie przepisuje wyrzuca błąd ?
Może tak spróbuj:
RewriteCond %{QUERY_STRING} ^p=([0-9]*)$ [NC]
RewriteRule .* index.php?page=artykuly&p=$1 [L,NC]
RewriteCond %{REQUEST_URI} ^artykuly/?$ [NC]
RewriteRule .* index.php?page=artykuly [L,NC]
Link: nazwa_strony.pl/artykuly/?p=3
d.stp
20.04.2013, 23:06:39
Teraz jak przejdę pod taki url:
nazwa_strony.pl/artykuly/?p=2
to nie wyświetla mi wyników - nie czyta w ogóle GETa
Reszta ok.
Całość:
Kod
RewriteEngine on
DirectoryIndex index.php
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} ^p=([0-9]*)$ [NC]
RewriteRule .* index.php?page=artykuly&p=$1 [L,NC]
RewriteCond %{REQUEST_URI} ^artykuly/?$ [NC]
RewriteRule .* index.php?page=artykuly [L,NC]
RewriteRule ^([a-zA-Z-_0-9]+)/([a-zA-Z-_0-9]+)/?$ index.php?page=$1&id=$2 [NC,L,QSA]
RewriteRule ^([a-zA-Z-_0-9]+)/?$ index.php?page=$1 [L]
Edit:
za pomoc dam na piwo
amii
20.04.2013, 23:25:40
Sprawdzenie czy są jakiekolwiej cyfry w query stringu ?
RewriteCond %{QUERY_STRING} [0-9]+ [NC]
Crozin
20.04.2013, 23:29:28
Nie ma potrzeby korzystania z RewriteCont i zmiennej QUERY_STRING, wystarczy skorzystać z
flagi QSA.
d.stp
21.04.2013, 00:09:53
Crozin, Niestety nie działa
amii, nie wiem o co chodzi ;/
próbowałem tak:
RewriteRule /artykuly/(.+) /index.php?page=artykuly?p=$1 [QSA]
Udało mi się zrobić. Ale jest następny problem...
Mam takie coś teraz:
Kod
RewriteEngine on
DirectoryIndex index.php
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=artykuly&p=$1 [QSA]
RewriteRule ^([a-zA-Z-_0-9]+)/([a-zA-Z-_0-9]+)/?$ index.php?page=$1&id=$2 [L]
RewriteRule ^([a-zA-Z-_0-9]+)/?$ index.php?page=$1 [L]
Problem jest w tym, że jak przejdę pod adres:
nazwa_strony.pl/artykuly/nazwa-artykulu/ to mod rewrite traktuje to jakbym chciał wyświetlić taką stronę w paginacji... ;/ pewnie prosta sprawa, ale jak pisałem ja się na tym nie znam
jaslanin
21.04.2013, 09:34:01
Kod
RewriteRule ^(.*)$ index.php?page=artykuly&p=$1 [QSA]
no bo ta reguła łapie ci wszystkie adresy url i kolejne nie mają szansy sie wykonać bo URL został już przetworzony.
d.stp
21.04.2013, 10:59:45
Po całej nocce kombinowania udało mi się zrobić tak, że doklejany parametr już działa, ale teraz jest problem bo jak wejdę na podstronę
artykuly/ to nie pokazują mi się żadne wyniki, jest tylko paginacja... Jak dopiszę parametr
?p=X to wtedy ładnie działa. Po wejściu w
artykuly/nazwa-arta/ też ładnie się wyświetla.
Całość:
Kod
RewriteEngine on
DirectoryIndex index.php
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^artykuly/$ index.php?page=artykuly&p=$1 [QSA]
RewriteRule ^([a-zA-Z-_0-9]+)/([a-zA-Z-_0-9]+)/?$ index.php?page=$1&id=$2 [L]
RewriteRule ^([a-zA-Z-_0-9]+)/?$ index.php?page=$1 [L]
Proszę o pomoc
Crozin
21.04.2013, 11:33:17
W pierwszym RewriteRule odnosisz się do pierwszej grupy wyłapanych znaków (p=$1), jednak nigdzie nie tworzysz tej grupy - we wzorze brak (...). Takie coś powinno generować Ci błąd. Co więcej nie dodałeś przy tej regule flagi L przez co porównywanie następuje dalej - ostatnia reguła również wyłapie taki URL.
PS. RewriteCond dotyczy jedynie jednej reguły RewriteRule, następującej tuż po nim.
d.stp
21.04.2013, 16:04:25
Ale nie pisz mi co robię tylko powiedz mi jak to zrobić żeby działało, bo ja się na tych regułkach kompletnie nie znam i nie mam zamiaru teraz się tego uczyć bo nie mam na to czasu...
Dodałem flage [L, QSA] ale dalej to samo
Pomoże ktoś?
A po co tak kombinujesz?
Kod
RewriteRule ^([a-zA-Z-_0-9]+)/?$ index.php?page=$1 [L]
RewriteRule ^([a-zA-Z-_0-9]+)/([a-zA-Z-_0-9]+)/?$ index.php?page=$1&id=$2 [L]
d.stp
22.04.2013, 08:22:52
Jak to po co? a jak inaczej to zrobic?...
Pomoże ktoś?
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.