Skocz do zawartości

urlencode i RewriteRule


yavaho

Rekomendowane odpowiedzi

W pliku htaccess mam prostą regułkę. Dopusczone są cyfy, duże i małe litery, znak - i znak +

RewriteRule ^search_([0-9a-zA-Z\+\-]+)\.html$ index.php?search=$1 [L]

Ale muszę przepuścić jeszcze znaki UTF-8

Koduje je oczywiście funkcją: urlencode($txt), ktora zamienia znaki UTF-8 na coś takiego: %C4%85%C5%9B%C4%99

Czyli powyższa regułka RewriteRule powinna jeszcze dopuścić znak % abym byl szczęśliwy.

Ale w ten sposób jak poniżej wywala błąd 404 gdy w linku znajdzie się znak %

RewriteRule ^search_([0-9a-zA-Z\+\-\%]+)\.html$ index.php?search=$1 [L]

Wiem że % jest znakiem specjalnym, ale jak można go zastaosować aby regułka rozpoznawała go jako string?

.

Odnośnik do komentarza
Udostępnij na innych stronach

yavaho możesz tego nie przeskoczyć, bo przeglądarki dekodują zakodowany adres url. Znak % dobrze dopisałeś do reguły.

Pokaże ci na przykładzie słówka: zażółć i przeglądarki firefox.

Pojedynczy urlencode daje efekt:

za%C5%BC%C3%B3%C5%82%C4%87

odpytanie serwera z takim ciągiem to dla firefoxa:

/search_zażółć.html

a dla mojego serwera w tym przypadku:

/search_za??????Ä?.html

Niestety ale tych znaków w przypadku serwera twoja reguła nie obejmuje.(PiO pousuwało te znaki)

Jedno rozwiązanie to podwójne urlencode() (musisz potem wartość $_GET['szukaj'] zdekodować), drugie to wstawienie wieloznaku tj. kropki . (polecam) a trzecie rozwiązanie to podanie zakresów znaków w wartościach hexadecymalnych np. \x00-\x08 (ale to i tak lepiej użyć kropki dla utf-8)

Nie mam pojęcia dlaczemu wyleciały i mają filtera Polskie znaki w adresach Joomla od nowa napisane, czytelnie i logicznie. Dylemat adres z www czy bez? Powinno to rozwiać wszelkie wątpliwości.

Naprawiam kodowanie [krzaki, chińskie znaki, polskie znaki] dowiedz się także czymże jest kodowanie znaków bo to podstawa.

Odnośnik do komentarza
Udostępnij na innych stronach

Zaczynam troche rozumieć :)

Literka "ą" po urlencode() to jest "%C4%85"

I wtedy taka reguła działa poprawnie

RewriteRule ^search_([ą]+)\.html$ index.php?search=$1 [L]

Ale to i tak jest troche nienormalne. Przecież aby być zgodnym ze standardem należy zakodować wszystkie znaki utf-8. Tylko po co jeżeli serwwer dostaje je w postaci odkodowanej?

Z podwójnym urlencode() działa. Z tym że robi się niepotrzebny tasiemiec z linka.

A z tą kropką to o co chodzi? Aby po użyciu urlencode zamienić % na kropki?

.

Odnośnik do komentarza
Udostępnij na innych stronach

A z tą kropką to o co chodzi? Aby po użyciu urlencode zamienić % na kropki?

RewriteRule ^search_(.+)\.html$ index.php?search=$1 [L]

I kropka zastępuje dowolny znak - lepszego rozwiązania dla utf-8 nie znajdziesz ;) Możesz też ograniczyć długość - ilość. Ale i tak mod rewite nie jest od zabezpieczania wiec i tak musisz wszystko zrealizować po stronie skryptu.

Literka "ą" po urlencode() to jest "%C4%85"

I wtedy taka reguła działa poprawnie

RewriteRule ^search_([ą]+)\.html$ index.php?search=$1 [L]

Równie dobrze mógłbyś zapisać tę regułę w ten sposób:

RewriteRule ^search_([\xC4\x85]+)\.html$ index.php?search=$1 [L]

Chodzi o to, że nie ma przedziału dla takich liter jakich ty chcesz uzyskać (mod rewrite musiałby mieć wsparcie dla takich kodowań) i możesz co najwyżej sobie zrobić ich listę i taki plik zapisać w kodowaniu utf-8 (np. tylko polskie znaki)

Mogę też polecić przeczytać to https://www.forum.optymalizacja.com/index.p...st&p=852823 i skorzystać z tamtejszego skryptu - krótki wniosek: linkuj wszędzie formę z zakodowanym adresem a zmienna dekoduj :) Zobacz też jak reagują różne przeglądarki po ręcznym wpisaniu adresu, jak kiedyś będę miał czas to opiszę obsługę polskich znaków w adresach.

Nie mam pojęcia dlaczemu wyleciały i mają filtera Polskie znaki w adresach Joomla od nowa napisane, czytelnie i logicznie. Dylemat adres z www czy bez? Powinno to rozwiać wszelkie wątpliwości.

Naprawiam kodowanie [krzaki, chińskie znaki, polskie znaki] dowiedz się także czymże jest kodowanie znaków bo to podstawa.

Odnośnik do komentarza
Udostępnij na innych stronach

RewriteRule ^search_(.+)\.html$ index.php?search=$1 [L]

Tak nie moze być. To zbyt proste, za dużo znaków by przepuszczało :) i mogły by byc konflikty z innymi porównaniami (regułkami).

Chyba opracuje sobie własną metodę zamieniając % na inny znak, ktory jeszcze nie został użyty do rozdzielania zmiennych w moich linkach.

.

Odnośnik do komentarza
Udostępnij na innych stronach

i mogły by byc konflikty z innymi porównaniami (regułkami).

Wystarczy umieścić tę regułę na końcu.

Tak nie moze być. To zbyt proste, za dużo znaków by przepuszczało

Mod rewrite nie służy do zabezpieczania... Od tego masz php żeby przefiltrować to co się znajdzie w zmiennej.

Nie mam pojęcia dlaczemu wyleciały i mają filtera Polskie znaki w adresach Joomla od nowa napisane, czytelnie i logicznie. Dylemat adres z www czy bez? Powinno to rozwiać wszelkie wątpliwości.

Naprawiam kodowanie [krzaki, chińskie znaki, polskie znaki] dowiedz się także czymże jest kodowanie znaków bo to podstawa.

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