Skocz do zawartości

mod_rewrite i subdomeny - jak przekazac wiecej parametrow?


lbt

Rekomendowane odpowiedzi

Witam,

Próbuję napisać .htaccess tak, żeby każdy użytkownik tworzący bloga miał go w adresie uzytkownik.adres.com .

W sieci jest mnóstwo gotowych rozwiązań, ale kończą się na pokazaniu jak przekierować uzytkownik.adres.com na adres.com/plik.php?u=uzytkownik .

np.

RewriteEngine On

RewriteCond %{HTTP_HOST} !^(www\.)?adres.com

RewriteCond %{HTTP_HOST} ^(www\.)?([^.]+)\.adres.com

RewriteRule ^(.*)$ /uzytkownik.php?userid=%2

Chciałbym do tego dodać jeszcze kilka parametrów dodawanych po adresie np. uzytkownik.adres.com/pl/wpis/12 ale nie mam już pomysłu jak się za to zabrać.

Wiele rzeczy próbowałem, stworzyłem jakieś htaccessowe potworki (żaden nie działał), ale czegoś w tym nie łapię.

Wielkie dzięki za pomoc

Pozdrowienia

B

Odnośnik do komentarza
Udostępnij na innych stronach

Wielkie dzięki. Ten kawałek działa i przekazuje i nazwę użytkownika i dalsze parametry.

Po wprowadzeniu zmian nie wiem, jak opisać stronę która ma się pojawić jak wpisane zostanie tylko uzytkownik.adres.com . Próbowałem paru rzeczy podobnych do tego:

RewriteRule ^()$ /uzytkownik.php?userid=%2&jezyk=pl

ale bez sukcesów..

Odnośnik do komentarza
Udostępnij na innych stronach

Szukam już pół dnia i nic nie mogę znaleźć... Większość "kursów" znalezionych przez googla to bzdury, a z samych specyfikacji nie umiem wywnioskować rozwiązania. No ale co zrobić, będę szukał do skutku.

Pozdrowienia

Odnośnik do komentarza
Udostępnij na innych stronach

RewriteRule ^pl/([a-z]*)/([0-9]*)$ /uzytkownik.php?userid=%2&co=$1&id=$2 [NC,L]

RewriteRule - przetwarzanie REQUEST_URI

^pl/([a-z]*)/([0-9]*)$ - wzorzec dopasowywany do REQUEST_URI (ten ralny wpisany w pasku przeglądarki, kliknięty link)

/uzytkownik.php?userid=%2&co=$1&id=$2 - podzapytanie wewnętrzne (niewidoczne), efekt przetworzenia rzeczywistego REQUEST_URI

%1, %2, %3, ... %9 - zmienne zawierajcie część z wyrażenia warunkowego (RewriteCond) zawarte w nawiasach wzorca

$1, $2, $3, ... $9 - zmienne zawierajcie część z REQUEST_URI przetwarzane w RewriteRule zawarte w nawiasach wzorca

Wzorzec jest uproszczoną wersją wzorca z PCRE, nawiasy oznaczają że część dopasowanego wzorca ma być przekazana do kolejnych zmiennych.

RewriteRule ^()$ /uzytkownik.php?userid=%2&jezyk=pl

Jeżeli nie chcesz przekazywać części REQUEST_URI do zapytania wewnętrznego nie stosujesz nawiasów. Żeby RewriteRule zadziałało musisz nastąpić dopasowanie REQUEST_URI do podanego wzorca. .* - kropka to dowolny znak, gwiazdka to dowolna ilość znaków.

^ - oznacza początek ciągu (nie zawsze), $ oznacza koniec ciągu

^ala$ - do takiego wzorca dopasuje się jedynie REQUEST_URI które ma wartość ala

ala - dopasuje się do dowolnego REQUEST_URI zawierającego w sobie ala.

RewriteRule ^()$ /uzytkownik.php?userid=%2&jezyk=pl

Tu chcesz przetworzyć całe uri nie używając tego rzeczywistego na inne wewnętrzne:

RewriteRule  .*  /uzytkownik.php?userid=%2&jezyk=pl

Spadam na mecz :killer:

nihil fit sine causa

Odnośnik do komentarza
Udostępnij na innych stronach

W tej chwili mam:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^(www\.)?adres.com
RewriteCond %{HTTP_HOST} ^(www\.)?([^.]+)\.adres.com
RewriteRule ^([a-z]*)/([0-9]*)$ /uzytkownik.php?userid=%2&jezyk=$1&id=$2 [L,NC]
RewriteRule .* /uzytkownik.php?userid=%2&jezyk=pl [NC]

i w takiej postaci nie przekazuje userid. Przy wywołaniu z innym kodem języka i tak jest pl, więc wchodzi reguła druga.

Jak zamienię reguły miejscami to wchodzi zawsze ta pierwsza (to raczej oczywiste, ale wolałem sprawdzić, zanim znów napiszę).

Co tu jest nie tak??

Wielkie dzięki za pomoc

Odnośnik do komentarza
Udostępnij na innych stronach

RewriteCond - wyrażenie warunkowe które dotyczy tylko pierwszego RewriteRule umieszczonego bezpośrednio po nim, można też zbudować blok warunków dla RewriteRule

[L,NC] - flagi, L - (last) ostatnie przetwarzane RewriteRule, NC (nocase) - wielkość liter nie jest brana pod uwagę.

Więc dzieląc to co napisałeś na niezależne bloki:

RewriteEngine On
################włączenie przepisywania####################################

#początek bloku

RewriteCond %{HTTP_HOST} !^(www\.)?adres.com
################sprawdzenie czy host zawiera www #############################
RewriteCond %{HTTP_HOST} ^(www\.)?([^.]+)\.adres.com
################przechwycenie do zmiennej nazwy subdomeny###################### 
RewriteRule ^([a-z]*)/([0-9]*)$ /uzytkownik.php?userid=%2&jezyk=$1&id=$2 [L,NC]
################wykonanie przepisania jeżeli R_C zostały spełnione i R_U pasuje do wzorca####
################jeżeli R_R zostanie wykonane dalsza część będzie pominięta [L]########### 

#koniec bloku i początek następnego

RewriteRule .* /uzytkownik.php?userid=%2&jezyk=pl [NC]
################zostanie wykonane jeżeli wcześniejsze R_R nie zostało wykonane##########

nihil fit sine causa

Odnośnik do komentarza
Udostępnij na innych stronach

Tak to właśnie rozumiem...

Powielam przed następną regułą RewriteCond, żeby przekazana została nazwa użytkownika (subdomena) i mam to:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^(www\.)?adres.com
RewriteCond %{HTTP_HOST} ^(www\.)?([^.]+)\.adres.com
RewriteRule ^([a-z]*)/([0-9]*)$ /uzytkownik.php?userid=%2&jezyk=$1&id=$2 [L,NC]
RewriteCond %{HTTP_HOST} !^(www\.)?adres.com
RewriteCond %{HTTP_HOST} ^(www\.)?([^.]+)\.adres.com
RewriteRule .* /uzytkownik.php?userid=%2&jezyk=pl [NC]

Z tego zawsze wchodzi ostatnia reguła...

Odnośnik do komentarza
Udostępnij na innych stronach

Tak zgadza się, ponieważ .* pasuje do każdego R_U i oznacza dowolny ciąg dowolnych znaków (więc zawsze zachodzi dopasowanie do wzorca). Zapomniałem napisać że do kolejnych R_R zostaje przekazane przetworzone R_U we wcześniejszych R_R (o ile doszło do dopasowania do wzorca i przetworzenia).

E: A ty chcesz osiągnąć różny efekt dla różnych R_U więc musisz wyrazić to odpowiednio we wzorcach(tak żeby pasowały lub nie), uściślając według potrzeb.

Przykładowo:

RewriteRule ^ala$ ala.php [NC,L] - zostanie wykonane jeżeli R_U=='ala'

RewriteRule ^kota$ kota.php [NC,L] - zostanie wykonane jeżeli R_U=='kota'

RewriteRule ^.*$ kota.php [NC,L] - zawsze zostanie wykonane

RewriteRule ^ala kota.php [NC,L] - zostanie wykonane jeżeli R_U zaczyna się od 'ala'

nihil fit sine causa

Odnośnik do komentarza
Udostępnij na innych stronach

Rozumiem...

Mam nadzieję, że to już ostatnie moje pytanie :)

Tylko jak zrobić warunek, że nie jest wpisane nic oprócz uzytkownik.adres.com ?

Takie coś nie działa:

RewriteRule ^$ /uzytkownik.php?userid=%2&jezyk=pl [NC]

choć wydaje mi się, że wyrażanie jest poprawne. Początek i zaraz koniec, czyli ciąg pusty.

Nie działa też ^!(.*)$ .

Odnośnik do komentarza
Udostępnij na innych stronach

! - to znak zaprzeczenia

RewriteRule !. /uzytkownik.php?userid=%2&jezyk=pl [NC]
#jeżeli R_U nie zawiera w sobie jednego dowolnego znaku

Tak na marginesie:

Nigdy czegoś takiego nie robiłem i ogólnie coś mi nie pasuje ale jeszcze się nie obudziłem :)

E:

Nie działa też ^!(.*)$

Powinno być w którejś z tych wersji:

!^(.*)$
!^.*$
!^.*
!.*
!.

nihil fit sine causa

Odnośnik do komentarza
Udostępnij na innych stronach

To też nie działa...

A w ogóle, to flaga L nie powinna zablokować dalszego przetwarzania? (nawiązuje do tego momentu, gdy ostatnia reguła brała cokolwiek i przekierowywała na sztywno wpisany adres)

Dzięki za całą pomoc :)

Odnośnik do komentarza
Udostępnij na innych stronach

Zablokuje jeżeli nastąpi dopasowanie do wzorca w którym jest [L]

Przeważnie takie rzeczy się robi według schematu od "największego do najmniejszego":

RewriteRule kota kota.php [NC,L]

RewriteRule kot kota.php [NC,L]

RewriteRule ko kota.php [NC,L]

RewriteRule k kota.php [NC,L]

RewriteRule .* kota.php [NC,L]

Więc jeżeli R_U ma wartość "kot" to zostanie wykonana 2 reguła, pierwsza nie pasuje a pozostałe zostają pominięte [L]

RewriteRule kota kota.php [NC]

RewriteRule kot kota.php [NC]

RewriteRule ko kota.php [NC]

RewriteRule k kota.php [NC]

RewriteRule .* kota.php [NC]

W takim wypadku jeżeli R_U ma wartość "kot" zostanie wykonana druga reguła, R_U przyjmie wartość kota.php i zostanie jeszcze wykonana ostatnia ponieważ pasuje do wszystkiego w tym i "kota.php"

Daj przykłady urli do przetwarzania to napisze ci gotowca :)

nihil fit sine causa

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności