Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mod_rewrite] przepisywanie metody GET
Forum PHP.pl > Forum > Serwery WWW > Apache
diniox
Problem wydaje się być powszechny ale o dziwno nic na ten temat znaleźć nie mogę więc może Wy pomożecie.
Mam wyszukiwarkę w PHP czyli standardowo:
  1. <form method="get" action="../szukaj.php">
  2. <div><input name="q" type="text" id="szukaj" /></div>
  3. <div><input type="submit" value="Szukaj" /></div>
  4. </form>

Tak więc po wciśnięciu przycisku Szukaj pokazuje mi się brzydki URL w stylu http://localhost/szukaj.php?q=__WPISANE_SLOWO__. A chciałbym żeby ten adres wyglądał tak: http://localhost/szukaj/__WPISANE_SLOWO__.
W internecie jest mnóstwo przykładów przepisania odwrotnego czyli mapowania "ładnego URL" na plik.php z QUERY STRING-iem. Wymyśliłem, że to powinno wyglądać jakoś tak:
Kod
RewriteRule ^szukaj.php\?q=(.*) /szukaj/ [L,R]

Ale to nie działa. Przekierowanie nie występuje. Jak usuwam \?q=(.*) to jest OK ale przecież to musi zostać bo w szukaj.php wyłapuje $_GET['q']. Proszę o pomoc.
qBK
Jeśli dobrze zrozumiałem, chcesz żeby w pasku adresu widniało np. http://localhost/szukaj/pralka ?

Teoretycznie takie coś powinno działać
RewriteRule ^szukaj\.php\?q=(.*) /szukaj/$1 [L,R]
(backlashash przed .php, bo kropka to znak specjalny, chociaż bez niej też by działało, bo kropka zastępuje dowolny znak -ale wtedy szukaj8php zamiast szukaj.php też by przeszło)

$1 to pierwsza zmienna wyłapana z wyrażenia, kolejna do użycia byłaby $2 itd.; do zmiennych wrzucane jest to co jest grupowane w nawiasy, czyli np. przy dwóch zmiennych miałbyś coś takiego:

RewriteRule ^osoba\.php\?imie=(.*)&nazwisko=(.*) /osoba/$1,$2 [L,R]

Niestety to co napisałem powyżej nie działa u mnie na Apache'u, a problemy stwarza znak zapytania. To znaczy

RewriteRule ^szukaj\.php\?q=(.*) /szukaj/$1 [L,R]
wywołanie 'http://localhost/szukaj.php?q=aaa' nie działa - to znaczy, nie ma redirecta
---------------
RewriteRule ^szukaj\.phpq=(.*) /szukaj/$1 [L,R] // na chama wywalony znak zapytania
wywołanie 'http://localhost/szukaj.phpq=aaa' ładnie działa, przekierowuje do /szukaj/aaa

Czy mógłby ktoś mnie oświecić, dlaczego znak zapytania w regexpie (po bożemu, poprzedzony backslashem) sprawia że takie coś nie przechodzi? Apache 2.2.6, WinXP. Pisałem wczoraj z nieco podobnym problemem który stwarzał dwukropek i też nie otrzymałem odpowiedzi.
tommy4
lmao jak to ma działać?

skoro chcesz mieć http://adres/szukaj/ to wrzuć metodę post.

Cytat
Czy mógłby ktoś mnie oświecić, dlaczego znak zapytania w regexpie (po bożemu, poprzedzony backslashem) sprawia że takie coś nie przechodzi? Apache 2.2.6, WinXP. Pisałem wczoraj z nieco podobnym problemem który stwarzał dwukropek i też nie otrzymałem odpowiedzi.


Poczytaj o RewriteCond %{QUERY_STRING}
diniox
Cytat(qBK @ 9.08.2008, 01:22:04 ) *
Niestety to co napisałem powyżej nie działa u mnie na Apache'u, a problemy stwarza znak zapytania. To znaczy

RewriteRule ^szukaj\.php\?q=(.*) /szukaj/$1 [L,R]
wywołanie 'http://localhost/szukaj.php?q=aaa' nie działa - to znaczy, nie ma redirecta
---------------
RewriteRule ^szukaj\.phpq=(.*) /szukaj/$1 [L,R] // na chama wywalony znak zapytania
wywołanie 'http://localhost/szukaj.phpq=aaa' ładnie działa, przekierowuje do /szukaj/aaa

A właśnie o to chodzi, że nie działa :-). Wydaje się być sensownie napisana reguła, wyrażenie regularne jest OK a jednak przeszkadza mu ten ?.
Cytat(tommy4 @ 9.08.2008, 09:10:42 ) *
skoro chcesz mieć http://adres/szukaj/ to wrzuć metodę post.

No właśnie chcę http://adres/szukaj/aaa lub http://adres/szukaj/aaa/ Tutaj raczej jak w każdej normalnej wyszukiwarce IMHO lepiej użyć GET.

Cytat(tommy4 @ 9.08.2008, 09:10:42 ) *
Poczytaj o RewriteCond %{QUERY_STRING}

Już parę dni temu czytałem bo myślałem, że może tutaj coś z tym warunkiem. Ale nie udało mi się samemu nic wymyślić jak można by QUERY_STRING i wykorzystać go w regule.
Shili
Cytat
Tutaj raczej jak w każdej normalnej wyszukiwarce IMHO lepiej użyć GET.
W każdej normalnej wyszukiwarce w pasku adresu jest parametr określający wyszukiwany string. Jeśli chcesz mieć adres bez tego stringa, jak to opisałeś w pierwszym poście, to nie masz wyjścia, bo i tak masz na wstępie "nienormalną" (z przymrużeniem oka) wyszukiwarkę.

Poza tym zdecyduj się czego chcesz, w pierwszym poście piszesz jedno, w drugim coś zupełnie innego.

Odnośnie jednak pokazania poszukiwanego ciągu:
1) funkcja urlencode - spacje i polskie znaki fajnie zakodować, bo mogą zostać źle odczytane
2) RewriteRule ^szukaj/(.*?)$ szukaj.php?q=$1 [L,R] albo coś mniej więcej w tym stylu
diniox
Cytat(Shili @ 9.08.2008, 12:50:50 ) *
W każdej normalnej wyszukiwarce w pasku adresu jest parametr określający wyszukiwany string.

Właśnie tak chcę.

Cytat(Shili @ 9.08.2008, 12:50:50 ) *
Poza tym zdecyduj się czego chcesz, w pierwszym poście piszesz jedno, w drugim coś zupełnie innego.

Moja pomyłka. Już poprawiłem.

Cytat(Shili @ 9.08.2008, 12:50:50 ) *
2) RewriteRule ^szukaj/(.*?)$ szukaj.php?q=$1 [L,R] albo coś mniej więcej w tym stylu

OK, może i w pierwszym poście zrobiłem błąd ale w następnym zdaniu wyjaśniam, że nie chodzi mi o ^szukaj/(.*?)$ szukaj.php?q=$1 tylko o odwrotną sytuację. Z tą podaną przez Ciebie (jak wcześniej napisałem) nie mam problemu - po 5 sekundach w Googlach miałbym rozwiązanie. Natomiast ja chcę przepisanie odwrotne (to chyba wynika z pierwszego przykładu w HTML) po wciśnieciu przycisku dostaje ?q=aaa a chcę rzeczy to się zmieniło na /aaa. Dokładnie tak jak zrozumiał qBK.
Shili
O odwrotną?

Czyli aktualnie masz adres:
szukaj/ala
a chcesz mieć:
szukaj.php?q=ala
tak?

To jest odwrotna do reguły którą Ci zapisałam.
diniox
Cytat(Shili @ 9.08.2008, 13:02:27 ) *
O odwrotną?

Czyli aktualnie masz adres:
szukaj/ala
a chcesz mieć:
szukaj.php?q=ala
tak?

To jest odwrotna do reguły którą Ci zapisałam.

Cytat
Tak więc po wciśnięciu przycisku Szukaj pokazuje mi się brzydki URL w stylu http://localhost/szukaj.php?q=__WPISANE_SLOWO__. A chciałbym żeby ten adres wyglądał tak: http://localhost/szukaj/__WPISANE_SLOWO__.
mroczek
Tak na szybko to chyba w .htaccess bedzie jakos tak:
RewriteEngine On
RewRewriteRule ^szukaj.php?q=(*)$ szukaj/$1
Shili
  1. <?php
  2. if($_GET['submit'] === 'submit') {
  3. $address = 'szukaj/'.$_GET['q'];
  4. header('Location:'.$address.'');
  5. }
  6. print_r($_GET);
  7.  
  8. ?>
  9.  
  10. <form action="" method="get">
  11. <input type="text" name="q" />
  12. <input type="submit" name="submit" value="submit" />
  13. </form>

Tak na szybko, bardzo na około i na pewno działające, sprawdziłam u siebie.
Z tym że do RewriteRule w stylu ^szukaj/(.*?)$ szukaj.php?q=$1&sumbit=$2 [L]

Problem z innymi wyrażeniami (pomijając znak zapytania) jest taki, że tutaj plik szukaj.php masz, a patrząc w drugą stronę: w katalogu szukaj nie masz folderu o nazwie takiej jak ciąg wyszukiwania.
diniox
Shili: czyli nie da się tego zrobić tylko w mod_rewrite?

mroczek: identycznie rozwiązanie podał qBK (ja zresztą też tak próbowałem już wcześniej) i nie działa. Jest jakiś problem ze znakiem ? (ewentualnie z QUERY_STRINGIEM).
Shili
Myślę, że musi się dać winksmiley.jpg
Nie wiem jednak do końca jak to zrobić, podaję więc sposób który na pewno zadziała.

Co do znaku zapytania spróbuj takiej składni:
[\?]
diniox
Shili: oczywiście kod PHP jest OK ale po dodaniu .htaccess z tym co napisałeś czyli RewriteRule w stylu ^szukaj/(.*?)$ szukaj.php?q=$1&sumbit=$2 [L] (oczywiście wcześniej jest RewriteEngine On) dostaję w Apache'u 500 Internal Server Error.
Shili
Napisałaś ^^

Mam nadzieję, że tego "w stylu" nie dodałeś do reguły winksmiley.jpg
diniox
I prawie mi się udało:
Kod
rewriteCond %{REQUEST_URI} /szukaj.php$
rewriteCond %{QUERY_STRING} ^q=(.*)
RewriteRule ^.*$ /szukaj/%1/ [R,L]

Tylko QUERY_STRING jest dalej dolepiany. Czyli mam coś takiego http://adres/szuka/aaa/?q=aaa a chciałbym http://adres/szuka/aaa/
qBK
Cytat(tommy4 @ 9.08.2008, 09:10:42 ) *
Poczytaj o RewriteCond %{QUERY_STRING}


Thx. W takim razie chyba to działa tak jak należy:
RewriteCond %{QUERY_STRING} ^q=(.*)$
RewriteRule ^szukaj\.php$ /szukaj/%1? [L,R]
Kicok
http://httpd.apache.org/docs/1.3/mod/mod_r...e.html#redirect - Query String Append
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.