Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mod_rewrite] Wykluczanie tekstu na poczatku regul
Forum PHP.pl > Forum > Serwery WWW > Apache
Seth
Mam taki nietypowy problem z htaccesem i RewriteRule.

Otoz mam strone, ktorej linki wygladaja tak:

www.example.com/cos/
www.example.com/cos/innego/
www.example.com/lalalalala/

I to obsluguje przez taka regule:

Kod
RewriteEngine On
RewriteCond %{REQUEST_URI} !^.+\.(css|png|gif|jpe?g|js|ico)$
RewriteRule ^(.+) index.php?page=$1 [NC]


Wszystko trafia mi do php. Problem mam jednak taki, ze chcial bym aby w przypadku pojawienia sie np takeigo adresu:

www.example.com/action/costam/

Regula przekazywala mi to co jest po action do action.php?action=$1

Nie wiem teraz jak te obie reguly polaczyc aby jedna, w przypadku gdy na poczatku jest slowo "action" przekazywala reszte do action.php, a druga wszystko inne do index.php.

Ma ktos jakis pomysl ?
NuLL
Nie lepiej Ci to parsowac w php w REQUEST_URI questionmark.gif Jak dla mnie sporo latwiej - i mozna robic ze zmiennymi co sie chce smile.gif
Seth
Nie chcialem tego uzywac bo po co wszystko includowac w index.php jak moge sobie ladnie oddzielic te dwie warstwy winksmiley.jpg (index.php sluzy mi do wyswietlania tresci, a action.php do akcji smile.gif).

No ale dzieki Maruszowi zaczelo dzialac :]

Ponizej jest rozwiazanie. Moze komus sie przyda:
Kod
RewriteEngine On
RewriteCond %{REQUEST_URI} !^.*\.(css|png|gif|jpe?g|js)$
RewriteRule ^action/([a-zA-Z_]+)[/|\\]+(.*) action.php?do=$1&params=$2 [L]
RewriteCond %{REQUEST_URI} !^.*\.(css|png|gif|jpe?g|js)$
RewriteRule ^(.*) index.php?page=$1 [L]
bendi
Trzy uwagi jeśli można:
Rozumiem, że w poniższej linijce
Kod
RewriteRule ^action/([a-zA-Z_]+)[b][/|\\][/b]+(.*) action.php?do=$1&params=$2 [L]

użyłeś klasy znakowej żeby wprowadzić, zależność między separatorami ścieżki, więc o ile nie potrzebujesz żeby pałka "|", też była włączona do klasy to jest ona tam niepotrzebna i wtedy wg mnie powinno być:
Kod
RewriteEngine On
RewriteCond %{REQUEST_URI} !^.*\.(css|png|gif|jpe?g|js)$
RewriteRule ^action/([a-zA-Z_]+)[/\\]+(.*) action.php?do=$1&params=$2 [L]
RewriteCond %{REQUEST_URI} !^.*\.(css|png|gif|jpe?g|js)$
RewriteRule ^(.*) index.php?page=$1 [L]


Druga uwaga, to już bajer, ale zawsze coś.
Widzę, ze zdefiniowałeś po action coby brał pod uwagę zarówno duże jak i małe litery. Tutaj przychodzą mi do głowy 2 rozwiązania:
- po apache2 można użyć klasy znakowej \w
- pod każdą wersją można dodać flagę NC czyli No Case regułka wtedy będzie wyglądać tak - RewriteRule ^action/([a-z_]+)[/\\]+(.*) action.php?do=$1&params=$2 [L, NC]

Trzecia dotyczy samego mechanizmu ustawiania zmiennej param.
Tutaj jest pewne zagrożenie, że parametry przesyłane getem zostaną dołączone do niej co może wywołać dość nieoczekiwane zachowanie. Proponuję to lekko zmodyfikować:
- RewriteRule ^action/([a-z_]+)[/\\]+(.*?)\? action.php?do=$1&params=$2 [L, NC, QSA]
Jak widać dodałem 2 rzeczy - ograniczyłem regułkę do pierwszego znaku zapytania - zakładam, że tak się będą zaczynać parametry GET'owe
- dodałem flagę QSA Query String Append - czyli automatyczne dołączanie przesłanych parametrów getowych.


Kurcze ale wywód, a miało być krótko:D
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.