Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [apache][php] mod_rewrite + błąd 404 w PHP
Forum PHP.pl > Forum > Przedszkole
Dynuel
Struktura linków na stronie będzie taka:

www.domena.com/nazwa-kategorii
www.domena.com/nazwa-kategorii/
- link do kategorii, gdzie nazwa będzie składać się z takich znaków: 'a-z', 'A-Z', '0-9', '-'

www.domena.com/nazwa-kategorii/4
www.domena.com/nazwa-kategorii/4/
- link do strony w kategorii, naturalnie numer strony będzie składał się wyłącznie z: '0-9'

do rozpoznawania adresów mam taki plik .htaccess
  1. RewriteEngine On
  2. RewriteRule ^([a-zA-Z0-9-]+)/$ index.php?category=$1 [L]
  3. RewriteRule ^([a-zA-Z0-9-]+)$ index.php?category=$1 [L]
  4. RewriteRule ^([a-zA-Z0-9-]+)/([0-9]+)$ index.php?category=$1&page=$2 [L]
  5. RewriteRule ^([a-zA-Z0-9-]+)/([0-9]+)/$ index.php?category=$1&page=$2 [L]

1. po wejściu na stronę naturalnie w php wartości $category i $page będą sprawdzane czy istnieją i w przypadku gdy nie istnieją chciałbym wywalić komunikat o błędzie 404 poprzez php, i teraz pytanie jakiego kodu php powinienem urzyć?
2. jak zrobić w pliku .htaccess że wszystkie adresy które nie dopasują sie do żadnej z powyższych regółek zostaną przekierowane na jeden konkretny adres np. /blad.php
3. styczność z mod_rewrite mam dopiero od kilku dni więc prosił bym by ktoś zerknął na powyższy kod pod względem poprawności (na powyższe adresy) oraz optymalizacji (czasu wykonywania)
dadexix
1. normalnego.. robisz kod strony np. 404.php i kod który sprawdza czy jest taki art.. jak nie ma to dajesz include("404.php");
2. chyba tak:

Kod
RewriteRule ^([^a-zA-Z0-9-]+) blad.php [L]
RewriteRule ^([^a-zA-Z0-9-]+)/([^0-9]+) blad.php [L]

oznacza to.. jeśli adres nie zgadza się z wzorem ro wyświetl blad.php

(takie małe doszkolenie:
"W nawiasach kwadratowych znak '^' ma inne znaczenie. Oznacza ono zaprzeczenie, czyli jeśli umieści się je przed znakiem lub zakresem, to ten znak lub zakres nie będzie mógł się pojawić w tym miejscu."
http://webmade.org/kursy-online/wyrazenia-...ne-kurs-php.php )

3. nie lepiej poprostu dać tak:

Kod
RewriteEngine On
RewriteRule ^([a-zA-Z0-9-]+)/ index.php?category=$1 [L]
RewriteRule ^([a-zA-Z0-9-]+)/([0-9]+) index.php?category=$1&page=$2 [L]
? bez tych 2 lini? jeśli dasz $ na końcu to wtedy gdy znajdzie się / to będzie błędnie działać... ale ten dolar nie potrzebny... a bez niego będzie działać nie zależnie czy będzie /artkul1/ czy /artykul1 czy /artykul1/dsggsd zawsze wywali index.php?category=artykul1
Proste nie?


Edit: nie wiem skąd mi się wzieło to o artykulach.. skąd w ogóle pomysł że chcesz arty robić... nie wiem:P w każdym bądz razie nie przejmuj się tym że cały post o artach... nie chce mi się zmieniać..
Dynuel
Cytat(dadexix @ 8.01.2008, 20:05:58 ) *
1. normalnego.. robisz kod strony np. 404.php i kod który sprawdza czy jest taki art.. jak nie ma to dajesz include("404.php");

tak sprawdzanie czy dany 'art' istnieje jest na samym początku skryptu, i mnie chodzi o to ze ja nie chce po prostu wyświetlić jakiejś tam informacji o błędzie 404, tylko chce wysłać w nagłówku ( header() ) informacje o błędzie do wyszukiwarki i dopiero ona ma wyświetlić swoją domyślną stronę błędu

Cytat(dadexix @ 8.01.2008, 20:05:58 ) *
2. chyba tak:

Kod
RewriteRule ^([^a-zA-Z0-9-]+) blad.php [L]
RewriteRule ^([^a-zA-Z0-9-]+)/([^0-9]+) blad.php [L]

oznacza to.. jeśli adres nie zgadza się z wzorem ro wyświetl blad.php

  1. RewriteRule ^([^a-zA-Z0-9-]+) blad.php [L]
  2. RewriteRule ^([^a-zA-Z0-9-]+)/([^0-9]+) blad.php [L]
  3. RewriteRule ^([a-zA-Z0-9-]+)/$ index.php?category=$1 [L]
  4. RewriteRule ^([a-zA-Z0-9-]+)$ index.php?category=$1 [L]
  5. RewriteRule ^([a-zA-Z0-9-]+)/([0-9]+)$ index.php?category=$1&page=$2 [L]
  6. RewriteRule ^([a-zA-Z0-9-]+)/([0-9]+)/$ index.php?category=$1&page=$2 [L]
  7. RewriteRule images/([a-z0-9-_.]+)$ images/$1 [L]

powyższy kod nie dziala, np na adres www.domena.com/dupa_/ wywala błąd 404, nie odsyła do blad.php

Cytat(dadexix @ 8.01.2008, 20:05:58 ) *
3. nie lepiej poprostu dać tak:

Kod
RewriteEngine On
RewriteRule ^([a-zA-Z0-9-]+)/ index.php?category=$1 [L]
RewriteRule ^([a-zA-Z0-9-]+)/([0-9]+) index.php?category=$1&page=$2 [L]
? bez tych 2 lini? jeśli dasz $ na końcu to wtedy gdy znajdzie się / to będzie błędnie działać... ale ten dolar nie potrzebny... a bez niego będzie działać nie zależnie czy będzie /artkul1/ czy /artykul1 czy /artykul1/dsggsd zawsze wywali index.php?category=artykul1
Proste nie?

i tutaj akurat chce by odsyłało do strony jedynie w przypadku poprawnego adresu, nie chce zeby np adres : '/artykul1/dsggsd' w ogole działał, zakres swoich adresów juz podałem wyżej

www.domena.com/nazwa-kategorii
www.domena.com/nazwa-kategorii/
www.domena.com/nazwa-kategorii/4
www.domena.com/nazwa-kategorii/4/

i nic wiecej, wszystko inne chce wysłać np do pliku blad.php (podpunkt 2 tego tematu) i tam w php wywalić blad 404 (podpunkt 1 tego tematu)
dadexix
Cytat
powyższy kod nie dziala, np na adres www.domena.com/dupa_/ wywala błąd 404, nie odsyła do blad.php
a utworzyłeś plik blad.php? bo ten skrypt nie odeśle do strony bład tylko przepisze adres na błąd.php - na pasku i na stronie błędów będzie ciągle request_url
jeśli chcesz uzyskać by na pasku adresu zniknął błędy adres a pokazał się adres strony blędu to w pliku błąd.php wpisz header("Location: $adres"); gdzie zmienna adres podaje plik strony błędu... oczywiście plik błąd.php być plikiem błędu:)

Twój htaccess:

Kod
RewriteRule ^([^a-zA-Z0-9-]+) blad.php [L]
RewriteRule ^([^a-zA-Z0-9-]+)/([^0-9]+) blad.php [L]
RewriteRule ^([a-zA-Z0-9-]+)/([^0-9]+) index.php [L]
RewriteRule ^([a-zA-Z0-9-]+) index.php?category=$1 [L]
RewriteRule ^([a-zA-Z0-9-]+)/([0-9]+) index.php?category=$1&page=$2 [L]
RewriteRule images/(.+) images/$1 [L]
objaśnienie(wg. numeru lini):
1. jeśli nazwa kategorii jest zła wywala plik blad.php
2. jesli nazwa kategorii i strona sa nie poprawne wywala blad.php
3. jesli strona nie jest w cyfrach przenosi do index //mozesz wsawić błąd.php czy co tam chcesz:) chyba że Cie źle zrozumiałem i chcesz że jeśli ktoś da kat1/2/aaaa to wywali bład czy coś w tym stylu..? a przeszkadza Ci ta końcówka? jeśli Ci przeszkadza to daj
Kod
RewriteRule ^([a-zA-Z0-9-]+)/?$ index.php?category=$1 [L]
RewriteRule ^([a-zA-Z0-9-]+)/([0-9]+)/?$ index.php?category=$1&page=$2 [L]

4. jeśli nazwa kategori jest dobra przepisuje adres
5. jesli nazwa kategorii i nazwa strony jest good przepisuje adres
6. przepisuje obrazki:) w takim wypadku możesz to zrobić inaczej... robisz katalog images a w jego htaccess RewriteEngine Off
Cytat
i nic wiecej, wszystko inne chce wysłać np do pliku blad.php (podpunkt 2 tego tematu) i tam w php wywalić blad 404 (podpunkt 1 tego tematu)

Kod
<?
header("HTTP/1.0 404 Not Found");
echo "404/ nie ma takiej strony";
?>
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.