Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: rewrite rule
Forum PHP.pl > Forum > Serwery WWW
wojto
witam,
mam podany kod w pliku .htaccess:
Kod
RewriteRule ^szukaj,(.*),(.*),([0-9]+),([0-9]+),(.*),(.*),(.*),(.*),(.*),([0-9]+).html+ szukaj.php?sz_slowo_kluczowe=$1&sz_nazwa=$2&sz_branza=$3&sz_wojewodztwo=$4&sz_powiat=$5
&sz_miejscowosc=$6&sz_telefon=$7&sz_ulica=$8&sz_nr_domu=$9&strona=$10
jak widac na zalaczonym obrazku liczba parametrow wynosi 10

W czym problem.
Nie przesyla parametru $10. Zamiast niego dostaje wartosc parametru $1 plus 0
Czy jest mozliwosc, aby odczytac wartosc parametru nr 10?

W dokumentacji jest napisane cos takiego:
Cytat
"Back-references are $N  (N=0..9) identifiers which will be replaced
by the contents of the Nth group of the matched Pattern."
czyli parametry moga byc od 0 do 9
Jak uzyskac dostep do parametru $0, ktora czesc linka to bedzie?

gdzies znalazlem inny cytat, zeby:
Cytat
use multiple RewriteRule statements chained together [C] if you need
more.
ale nie wiem co da to [C]

z gory dzieki za pomoc.
hwao
php pocz -> serwery
akubiczek
Ten post powinien ci wyjaśnić zasadę łączenia: http://tiny.pl/fs9

Próbowałem jednak stworzyć działający przykład twojego problemu i nie udało mi się. smile.gif Daj znać jak coś wymyślisz.
wojto
niestety, ale dalej nie wiem jak to zrobic, probowalem dac {$10} oraz ${10}, a takze: [C],[N],[C,QSA] i dalej nic
bendi
a rozwazales przypadek ze regulka mzoe byc zle napisana, bo wg mnie tak sie wlasnie stalo. Chodzi o kropke i gwiazkdke.

Mianowicie jest ogromna roznica miedzy zapisem

.* oraz .*? Wiecej informacji tutaj

[edit] Ok doczytam manuala. [/edit]
akubiczek
Bendi, reguła jest dobra tylko naprawdę jest tak, że mod_rewrite obsługuje max. do 9 parametrów. Poza tym regexpy mod_rewrite mają kilka drobnych różnic w stosunku do tych z php.


Wojto: chyba nie zapoznałeś się z postem, który ci wskazałem tongue.gif Nie masz używać żadnego {$10} ponieważ N jest maks. 9. Musisz za to pokombinować z kolejnymi zamianami, tak jak w przykładzie. Schemat działania jest taki:

1. bierzesz URLa i zamieniasz pierwszy parametr, a wszystkie pozostałe kopiujesz
[C,QSA]
2. powtarzasz krok 1 dla wszystkich parametrów

chodzi o to, że w jednej regule zamieniasz tylko jeden parametr (możesz oczywiście od razu zamienić 9, ale dla uproszczenia róbmy to kolejno). Dla 10 parametrów tworzysz 10 regułek, w których używasz tylko parametru $1 . Każda następna regułka dostaje efekt pracy swojej poprzedniczki.

Nie wiem jak to inaczej wytłumaczyć. W wolnej chwili postaram ci się napisać działający przykład.


...kilka godzin później....

Masz:

Kod
RewriteEngine on
RewriteRule ([^,\.]+),(.*) p1=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&p2=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&p3=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&p4=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&p5=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&p6=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&p7=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&p8=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&p9=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&p10=$2 [C]
RewriteRule (.*)\.html szukaj.php?$1


Piwo Rkingsmiley.png
bendi
2 sprawy:

- gdzie w tym kodzie nalezy dodac QSA, bo z tego co mi sie wydaje aby regulka byla skopiowana trzeba to dopisac
- zamiast pisac ([^,\.]+), mozna napisac (.*?),. Wywolanie ze znakiem zapytania spowoduje wlalczenie non-greedy (niby roznica nieznaczna, ale o ile czytelniejsza - pobierz wszystko do pierwszego napotkanego przecinka i po sprawie), wiecej na ten temat w drugiej czesci mojego arta o regexpach

Wtedy cala regulka przyjmie postac:
Kod
RewriteEngine on
RewriteRule (.*?),(.*) p1=$2 [C]
RewriteRule (.*?),(.*) $1&p2=$2 [C]
RewriteRule (.*?),(.*) $1&p3=$2 [C]
RewriteRule (.*?),(.*) $1&p4=$2 [C]
RewriteRule (.*?),(.*) $1&p5=$2 [C]
RewriteRule (.*?),(.*) $1&p6=$2 [C]
RewriteRule (.*?),(.*) $1&p7=$2 [C]
RewriteRule (.*?),(.*) $1&p8=$2 [C]
RewriteRule (.*?),(.*) $1&p9=$2 [C]
RewriteRule (.*?),(.*) $1&p10=$2 [C]
RewriteRule (.*?)\.html szukaj.php?$1

Prawda ze ladniej ;>
akubiczek
ślicznie smile.gif

QueryStringAppend (QSA) nie używałem, bo nie doczytałem jak to się dokładnie zachowuje smile.gif Przy zwykłym łączeniu Chain [C] też działa dobrze, przekazując wynik regexpa do kolejnej regułki. Sprawdzone w praktyce.

No, myślę że rozwiązaliśmy problem kolegi Wojto smile.gif
wojto
Cytat(akubiczek @ 2004-10-26 10:03:08)
No, myślę że rozwiązaliśmy problem kolegi Wojto smile.gif

zgadza sie smile.gif
juz poradzilem sobie wczesniej poprzez zmniejszenie liczby parametrow, ale klient dodal nowe, wiec jednak musialem z tego skorzystac
ps. ten sposob podany przez ciebie bendi u mnie nie dziala, nie znajduje strony, wyswietla 404.
ten
Kod
RewriteRule ([^,\.]+),(.*) sz_slowo_kluczowe=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&sz_nazwa=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&sz_branza=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&sz_wojewodztwo=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&sz_powiat=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&sz_miejscowosc=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&sz_telefon=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&sz_ulica=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&sz_osob=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&strona=$2 [C]
RewriteRule (.*)\.html szukaj.php?$1
dziala jak nalezy


// edit: jednak nie dziala jak nalezy, bo wszystkie nastepne linki w tym pliku (dokladniej te zawierajace przecinek) juz nie obsluguje wcale

przykladowy kawalek pliku:
Kod
RewriteRule ^firma,([0-9]+).html+ firma.php?id=$1
RewriteRule ^szukaj.html+ szukaj.php

RewriteRule ([^,\.]+),(.*) sz_slowo_kluczowe=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&sz_nazwa=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&sz_branza=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&sz_wojewodztwo=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&sz_powiat=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&sz_miejscowosc=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&sz_telefon=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&sz_ulica=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&sz_osob=$2 [C]
RewriteRule ([^,\.]+),(.*) $1&strona=$2 [C]
RewriteRule (.*)\.html szukaj.php?$1

[CODE]RewriteRule ^dodaj.html+ dodaj.php?rejestracja=1
RewriteRule ^aktualizuj.html+ dodaj.php?rejestracja=2
RewriteRule ^edytuj,([0-9]+).html+ edytuj.php?id=$1
RewriteRule ^usun,([0-9]+).html+ usun.php?id=$1

w tym fragmencie tych dwoch:
Kod
RewriteRule ^edytuj,([0-9]+).html+ edytuj.php?id=$1
RewriteRule ^usun,([0-9]+).html+ usun.php?id=$1

juz nie obsluguje
jakies sugestie?
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.