Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mod_rewrite] Połączenie reguł
Forum PHP.pl > Forum > PHP
sebekzosw
Witam!

Piszę z prośbą o pomocy przy połączeniu reguł . Mam takie 2 reguły:


  1. RewriteRule ^(.*)\.html$ $1.php?page=$1[QSA,L]


i

  1. RewriteRule ^(.*)\.html$ page.php?id=$1 [QSA,L]


Załóżmy, że nie istnieje plik text.php i powinno się wykonać takie coś:

Wpisujemy adres www.domena.pl/text.html . jeżeli nie istnieje plik text.php to wykonuje się page.php?id=text . Jeżeli plik istnieje to się wykona. Nie mam pojęcia jak to połączyć, a jest mi to potrzebne w celu skrócenia wpisów to tak to dla każdej podstrony mi się będzie powtarzała jedna reguła czyli:

  1. RewriteRule ^podstrona\.html$ podstrona.php?page=podstrona[QSA,L]
  2. RewriteRule ^podstrona2\.html$ podstrona2.php?page=podstrona2[QSA,L]



Takie coś ma być:

  1. RewriteCond %{REQUEST_FILENAME} -d
  2. RewriteCond %{REQUEST_FILENAME} -f
  3. RewriteRule ^(.*)\.html$ $1.php?page=$1[QSA,L]
  4.  
  5. RewriteRule ^(.*)\.html$ page.php?id=$1 [QSA,L]


wpisałem

  1. print_r($_SERVER);


i może problem jest to, że po wpisaniu www.domena.pl/test.html wywala takie coś:

Kod
[REQUEST_URI] => /test.html



Kod
RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI} !-f
RewriteRule ^(.*)\.html$ $1.php [QSA,L]

RewriteRule ^(.*)\.html$ page.php?id=$1 [QSA,L]


jeżeli istnieją pliki [nazwa].php (w przeglądarce wpisuje [nazwa].html) to wszystko dobrze mi dopasowuje. Jednak jeżeli plik nie istnieje powinno mi jakiś dopasować do reguły
Kod
RewriteRule ^(.*)\.html$ page.php?id=$1 [QSA,L]
- tylko nie wiem dlaczego to nie robi ;/ mogę liczyć na pomoc? w mozilli wywala mi błąd:

Cytat
Not Found

The requested URL /o-mnie.php was not found on this server.

Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.



Kod
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(4[^/]*)$ /process.php?variable=$1 [L]

RewriteCond %{SCRIPT_FILENAME} !process\.php
RewriteRule ^([^/]*)$ index.php?$1


znalazłem coś takiego:
http://stackoverflow.com/questions/1478993...1479971#1479971

ale nie mogłem dopasować tego ;/
bim2
Hmm, a przekaż całość do php i tam sobie to obrób. smile.gif
Kod
RewriteRule ^(.*)$ modrewrite.php?url=$1

Coś w ten deseń. I sprawdzasz file_exists czy plik istnieje, jeśli tak to require_once plik, jeśli nie to require_once page.php i ustawienie zmiennej _GET.

Pozdrawiam, Michał.
Fifi209
Prawie jak zawsze odsyłam:
http://eriz.pcinside.pl/weblog/mod_rewrite...wiazac-208.html
sebekzosw
Cytat(bim2 @ 6.07.2010, 22:38:44 ) *
Hmm, a przekaż całość do php i tam sobie to obrób. smile.gif
Kod
RewriteRule ^(.*)$ modrewrite.php?url=$1

Coś w ten deseń. I sprawdzasz file_exists czy plik istnieje, jeśli tak to require_once plik, jeśli nie to require_once page.php i ustawienie zmiennej _GET.

Pozdrawiam, Michał.



to jest ostateczna możliwość smile.gif

Cytat(fifi209 @ 6.07.2010, 23:03:26 ) *


widziałem tą stronę wiele razy podczas szukania odpowiedzi na moje pytanie jednak tam jej nie ma ;/
erix
Cytat
jeżeli istnieją pliki [nazwa].php (w przeglądarce wpisuje [nazwa].html) to wszystko dobrze mi dopasowuje. Jednak jeżeli plik nie istnieje powinno mi jakiś dopasować do reguły

W zalinkowanej notce wyraźnie napisałem, że warunki obowiązują do najbliższego RewriteRule. Dla drugiego musisz mieć osobne.
sebekzosw
Cytat(erix @ 7.07.2010, 09:49:24 ) *
W zalinkowanej notce wyraźnie napisałem, że warunki obowiązują do najbliższego RewriteRule. Dla drugiego musisz mieć osobne.


Wiem, czytałem to, więc mam taką regułę:

Kod
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.html$ page.php?id=$1 [L]

RewriteCond %{SCRIPT_FILENAME} !page\.php
RewriteRule ^(.*)\.html$ $1.php [QSA,L]


Jeżeli wpiszę www.domena.pl/o-mnie.html (nie ma pliku o-mnie.php) to dobrze mi się wykonuje reguła - dodaje mi do pliku page.php?id=o-mnie. Ale jeżeli wpisze www.domena.pl/test.html (plik test.php istnieje) to próbuje mi to podpiąć pod page.php co skutkuje błędem. A sposób:
Cytat
Przerzucić obsługę przepisywanych adresów bezpośrednio do skryptu sprawdzając jedynie, czy istnieją pliki/katalogi, czy nie. O tym już na koniec artykułu.
jak już mówiłem wcześniej, to ostateczność...
ADeM
Popatrz na kolejność swoich reguł. Pierwsza reguła pasuje do adresu i w dodatku ma flagę L, więc dalej już nawet nie szuka.
sebekzosw
ale zobacz wcześniej:

Kod
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d


sprawdza czy plik/katalog istnieje... jezeli nie to ma robic sie plik page.php a nie robi sie ;/
ADeM
Mój błąd. Ale w takim razie chyba sprawdzasz plik ze złym rozszerzeniem ;-)
sebekzosw
dobrze sprawdzam smile.gif tak było w książce smile.gif
bim2
Tylko, że {REQUEST_FILENAME} to będzie chyba bez .php albo z .html bo juz się pogubiłem winksmiley.jpg Tak czy siak, nie znajdzie ci poprawnie nigdy pliku.
sebekzosw
"{REQUEST_FILENAME} - pełna ścieżka dostępu do pliku wymienionego w żądaniu. Jest to ta sama wartość, którą przechowuje zmienna {SCRIPT_FILENAME}" - taka ciekawostka...

Ale chodzi oto, że w połowie to działa, tzn jeżeli plik nazwa.php nie istnieje do dopisuje do page.php?id=nazwa. jednak jeżeli plik nazwa2.php też istnieje to i tak podpina do page.php?id=nazwa2 a powinien wykonać regułę w następnym RewriteRule.


Jaki jest w tym błąd:
Kod
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.html$ page.php?id=$1 [L]

RewriteCond %{REQUEST_FILENAME} !page\.php
RewriteRule ^(.*)\.html$ $1.php [QSA,L]
ADeM
No ale już Ci przecież napisałem co masz źle...

Masz na serwerze pliki:
-page.php
-test.php

Wywolujesz "http://domena.pl/test.html". Serwer sprawdza czy istnieje plik test.html. Nie istnieje (istnieje test.php), więc idzie na "page.php?id=test".
sebekzosw
po części masz racje mimo iż w SCRIPT_FILENAME jest /test.php a nie test.html a jak wcześniej pisałem to REQUEST_FILENAME == SCRIPT_FILENAME - w takim razie jakie jest rozwiązanie tego problemu?
ADeM
Kod
RewriteCond %{DOCUMENT_ROOT}/sciezka/do/pliku/$1.php -f
RewriteRule ^(.*)\.html$ $1.php [L]
RewriteRule ^(.*)\.html$ page.php?id=$1 [L]
sebekzosw
Kod
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^(.*)\.html$ $1.php [QSA,L]
RewriteRule ^(.*)\.html$ page.php?id=$1 [QSA,L]
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.