Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [apache][mod_rewrite] Podejście uniwersalne
Forum PHP.pl > Forum > Serwery WWW > Apache
sniffer
Witam wszystkich zainteresowanych,

problem, który tu spróbuje przedstawić będzie benefitował w SEO ale jak również przejrzystości serwisu oraz tworzeniu jego mapy.
Moim celem jest wypracowanie zestawu reguł rewrite dla apacha (możliwie również dla ISS ale nie jest to moim zamierzeniem docelowym) będącymi uniwersalnymi dla całego serwisu niezależnie od ilości zmiennych do przesłąnia poprzez nazwę pliku.

Ogólna postać nazw i katalogów:

1. nazwastrony_zmienna-wartosczmiennej.html

przy czym część: 'zmienna-wartosczmiennej' może powtarzać się n-krotnie a separatorem zmiennych byłby znak '_' (podkreślenie). 'nazwastrony' może być to nazwa pliku *.php lub wartość jakiejś zmiennej określającej stronę (na razie nie ma to większego znaczenia)

2. /nazwastrony/nazwazmiennej/wartosczmiennej/nazwapodstrony.html [lub index.html gdy brak lub domyślne]

przy czym 'nazwapodstrony' może mieć dodatkowo postać z podpkt. 1. (tak dla uogólnienia, mimo to że może w tym wypadku powstać dublowanie zmiennych)

tak jak i w podpunkcie 1. taki i tutaj część: 'nazwazmiennej/wartosczmiennej/' powtarzać się może n-krotnie


Rozwiązanie:

Jest o tyle trudne, że nie udało mi się w internecie ani w dokumentacji znaleść informacji na temat możliwości rekurencji pewnych części nazwy pliku, mianowicie nie wiem czy można stosować coś w rodzaju: (([a-zA-Z0-9]+)-([a-zA-Z0-9]*))*jako regułę rewrite gdyż problemem staje się odwołanie do kolejnych elementów. Trzeba również wziąść poprawkę na nazwy o wartości zmiennych, które nie mogą zawierać znaków: '-' oraz '_' lub trzeba zmodyfikować odpowiednio reguły: '[a-zA-Z0-9]' aby dopuszczały taką możliwość. Jako możliwe rozszerzenia plików dopuszczamy: *.htm, *.html, *.asp (opcjonalnie). Niezależnie od wybranego rozszerzenia serwowana jest ta sama strona. Trzeba również dodać odpowiednie reguły RewriteCond, które sprawdzały by czy rządany plik istnieje na serwerze, bo jeśli tak to reguły rewrite musiałby by zostać pominięte aby nie uniemożliwić dostępu do pliku/folderu.

Pierwszy rzut na taśmę, reguły poprawne lecz nie zawierające wszystkiego ww.

metoda łapotologiczno-piechotna:

1.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)_(.+)-(.+)_(.+)-(.+)\.(html|htm|asp)$ index.php?p=$1&$2=$3&$4=$5 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)_(.+)-(.+)\.(html|htm|asp)$ index.php?p=$1&$2=$3 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)\.(html|htm|asp)$ index.php?p=$1 [L,QSA]

no i bez rekurencji można pisać te regułki bez końca... tu tkwi główny problem, czekam na propozycje...

2. na razie pomijam, dopuki nie wskóramy czegoś sensownego dla pkt 1.

Oczywiście na końcu należy dodać flagę [QSA] aby przekazać inne zmienne przesłane standardowo.

Flaga: [L] ma zakończyć rewriting (pominąć następne reguły) czy tutaj zadziała prawidłowo oraz czy nie będzie się gryźć z RewriteCond?
Czy niezbędnym jest pisanie RewriteCond przed kazdą RewriteRule czy można to jakoś obejść?

Czekam na sensowne propozycje i dyskusje na poziomie,
pozdrawiam
siemakuba
Cytat
no i bez rekurencji można pisać te regułki bez końca... tu tkwi główny problem, czekam na propozycje...
no właśnie - można. tylko po co?

być może twoje założenia wypływają z innych założeń tudzież jakichś innych powodów, ale ja jak do tej pory nie znalazłem powodu żeby posuwać się dalej niż:
Kod
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule ^(.*)$ index.php?request=$1 [L,NC,QSA]

na poziomie Apache nie potrzebuje wiedzieć nic więcej oprócz tego, czy plik / katalog istnieje i gdzie przesłać treść żądania w celu dalszej obróbki. Łapiąc całe zapytanie (np. twój nazwastrony_zmienna-wartosczmiennej.html) w php mam dużo większe pole do popisu przy jego przetwarzaniu i decydowaniu co dalej.

Cytat
Flaga: [L] ma zakończyć rewriting (pominąć następne reguły) czy tutaj zadziała prawidłowo oraz czy nie będzie się gryźć z RewriteCond?
Czy niezbędnym jest pisanie RewriteCond przed kazdą RewriteRule czy można to jakoś obejść?
Czy przypadkiem flaga L nie kończy przetwarzania tylko w obrębie zasięgu danego RewriteCond?

pozdr.
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.