Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Apache + mod_rewrite
Forum PHP.pl > Forum > Serwery WWW > Apache
anas
Witam.

Od jakiegoś czasu walczę z problemem połączenia dwóch wersji php(php5 oraz php4) jako moduły na jednym apache'u - odpada możliwość robienia jednej wersji jako CGI ze względu na zmienne środowiskowe. Udało mi się po zmianie w źródłach php5 mime-type na inny zainstalować to na jednym apache'u, z tym że php5 chodzi na innym porcie i teraz chciałbym wszystkie wywołania do plików z rozszerzeniem php5 przekierować (np. za pomocą mod_proxy) na ten sam adres z tym że na port 8080 i do tego samego pliku.

Czyli jak ktoś wpisze.

http://www.mojastrona.pl/skrypt.php5 -> przekieruje go wewnętrznie za pomocą mod_rewrite na adres http://www.mojastrona.pl:8080/skrypt.php5 itd - http://mojastrona.pl/katalog/skrypt.php5 na http://mojastrona.pl:8080l/katalog/sktypt.php5

a jeżeli chodzi o pozozstałe skrypty, chciałbym żeby były one przetwarzane na porcie 80, wg configa dla php4.

Jeżeli uda mi się to jakoś złożyć do kupy, postaram się napisać jakiegoś tutoriala jak to zrobić krok po kroku.

pozdrawiam i dzięki za każdą podpowiedź

anas

Ps. Taki oto kod udalo mi sie uzyskac od pewnego administratora z za granicy, ktory to przekierowuje wywolania dla plikow z koncowka .php5 na inny serwer dodajac do wywlywanej domeny przedrosterk php5.


Kod
<IfModule mod_proxy.c>
RewriteEngine On
# this condition should only match on files ending in php5 (any case)
RewriteCond %{REQUEST_FILENAME} ^(.*).php5$ [NC]
# this condition picks apart the host part of the URL, we need
# to change www.alpha.com -> php5.alpha.com
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
# this rule modifies the request and submits as proxy
RewriteRule (.*)(\.php5)   http://php5.%1/$1$2 [P,NC]
ProxyRequests Off

</IfModule>
Imperior
Jakie jest uzasadnienie przekierowywania na inny port? Po co to? Jak są dwa moduły to chyba może działać normalnie?
anas
Witam

No wlasnie w tym problem, ze normalnie sie wywala apache - a ja to robie na zasadzie takiej ze mam dyrektywne ifconfig i tam ustawiam w zaleznosci od portu odpowiednia wersje php - generalnie samo ustawienie dziala - bo gdy wywolam jakis skrypt dla www.mojadmoena.pl:8080/skrypt.php5 to wszystko pieknie chodzi tylko ja nie chce miec w adresie tego jawnego podawania portow - wlasnie po to chce uzyc mod_rewrite, aby przekierowal to wewnetrznie bez ingerencji uzytkownika dla plikow z rozszerzeniem .php5 - tak aby wywolania www.mojadomena.pl:8080/skrypt.php5

pozdrowka

anas
Imperior
To jak to jest?
Czy oba moduły są załadowane naraz?
Jeśli nie to czy za każdym razem jest ładowany?
A jeśli tak to tylko uaktywniany dla plików jest naraz jeden?
anas
Hej.

Tak naprawde to sa dwa niezalezne apache dzialajace na roznych portach z roznymi wersjami php(na jednym czwarta, na drugim piata) - tak pozostala konfiguracja typu virtualki, itd pozostaje bez zmian - i teraz chodzi o to aby apache pracujacy na porcie 80 przekierowal wywolania do plikow z roszerzeniem .php5 na apache'a ktory chodzi na porcie 8080.

pozdrawiam

anas
Imperior
O widzisz, czyli to nie są 2 moduły na 1 apachu, tak jak pisałeś na początku...
anas
Hej.

Uwielbiam jak ludzie czytaja do konca posty i odpowiadaja w sposob nieuargumentowany zadnym doswiadczeniem - gdyby bylo to takie proste jak piszesz dawno bym tak zrobil, ale nie od dzis wiadomo, ze postawienie dwoch wersji php(PHP4 + PHP5) jako moduly na jednym apache'u graniczy z cudem - malo tego ingerencja w zrodla i zmiana mime-type, nie sprawdza sie. Co do wersji CGI, jak juz napomnialem wielokrotnie - nie chce tego stosowac, bo dbam o swoich Klientow i nie udostepnie im wersji php w ktorej nie beda mogli skorzystac ze zmiennej srodowiskowej $_SERVER - bo z doswiadczenia wiem ze jest ona przydatna i utrudnilaby im zycie... skoro twierdzisz ze jest inaczej i ze kombinowanie z przekierowaniem pochwal sie jak Ty bys tego zrobil, albo lepiej sprobuj najpierw to zrobic, a pozniej sie wypowiadaj.

pozdrawiam

anas

Ps. To hehehe i podkreslanie dwoch instancji jako zabieg smieszny swiadczy tylko o fakcie ze sugerujesz zabiegi ktorych nie probowales...
FiDO
Jest to jakies wyjscie... Sam tez jestem zainteresowany wspolbieznym dzialaniem obu wersji php, wiec temat mnie interesuje. Nie wiem czy dobrze Cie zrozumialem, ale zrobilem chyba cos takiego...
Do czesci konfiguracji Apacha na php4 (tego "glownego") dopisujemy takie cos:
Kod
       ProxyRequests Off
       RewriteEngine On
       RewriteCond %{REQUEST_FILENAME} ^(.*).php5$ [NC]
       RewriteRule /(.*) http://%{HTTP_HOST}:88/$1 [P]

Oczywiscie port sobie ustawiasz swoj, ja mam akurat 88.
Dziala chyba tak jak chciales, tzn. jak klikam w plik z rozszerzeniem to "po cichu" jest on przekierowywany do drugiego apacha z php5, ale w pasku adresu nic sie nie zmienia, nigdzie nie widac tego ukrytego portu.

PS. Przenosze na forum Apache.
anas
Hej.

@FiDO - hej i thx za odpowiedz - jedyna konkretna i rzeczowa. Teraz jak na to patrze to jest to dla mnie czytelne. Nie bardzo potrafie sie jeszcze poslugiwac mod_rewrite, ale przypadl mi do gustu. Jesli moge zapytac i opisac jak to rozumiem, a Ty w razie "w" bedziesz mogl mnie naprostowac jak blednie rozumuje, to bede wdzieczny:

Wiec tak:

- Dlaczego ustawiasz dyrektywe ProxyRequests na Off ? Tego zapisu kompletnie nie rozumiem.

- Nastepnie uruchamiasz mod_rewrite i zapisujesz warunek ze jesli zmienna srodowiskowa (bo z tego co rozumiem przez %{zmienna} odwolujemy sie do zm. srodowiskowych) rozpoczyna sie od 0 lub wiecej dowolnych znajow i konczy na .php5, to on to zapisze do zmiennej $1 uzytej w RewriteRule - parametr [NC] oznacza ze nie bedzie bral pod uwage wielkosci liter

- i od razu zapytam czy nie lepiej byloby zapisac to o tak ^(.+).php5$ - bo to wymusi ze plik sklada sie z przynajmniej jednego lub wiecej znakow + .php5 ?

- teraz w RewriteRule - dlaczego zaczyna sie pierwszy czlon od znaku / i do czego sluzy pierwszy czlon - co w nim sprawdzasz - bo dalej rozumiem to tak: jak spelni sie warunek z RewriteCond to on stworzy ciag http://zmienna_srod_przechowujaca_wywolywa...a_z_RewriteCond i parametr [P] - aby przekazal to do mod_proxy?

pozdrawiam i spadam testowac.

raz jeszcze dzieki

anas
FiDO
Cytat
- Dlaczego ustawiasz dyrektywe ProxyRequests na Off ? Tego zapisu kompletnie nie rozumiem.

To jest tutaj zabieg czesciowo kosmetyczny.. nie ma wplywu na dzialanie calego tego mechanizmu, ale wylacza proxy, tak zeby powiedzmy ktos inny majacy dostep do Twojego apacha nie ustawil go sobie czasem jako proxy.

Cytat
- Nastepnie uruchamiasz mod_rewrite i zapisujesz warunek ze jesli zmienna srodowiskowa (bo z tego co rozumiem przez %{zmienna} odwolujemy sie do zm. srodowiskowych) rozpoczyna sie od 0 lub wiecej dowolnych znajow i konczy na .php5, to on to zapisze do zmiennej $1 uzytej w RewriteRule - parametr [NC] oznacza ze nie bedzie bral pod uwage wielkosci liter

prawie dobrze.. on tego nie zapisze do $1 uzytego w RewriteRule. Substringi z RewriteCond sa zapisywane do zmiennych %N, ale do konca nie wiem jeszcze w jaki sposob smile.gif W kazdym razie zmienne $N w RewriteRule to sa odwolania do substringow z tej samej dyrektywy tylko ze z pierwszego parametru. Czyli jak mamy RewriteRule /(.*) http://%{HTTP_HOST}:88/$1 [P] to $1 jest odwolaniem sie do (.*) z pierwszej czesci.

Cytat
- i od razu zapytam czy nie lepiej byloby zapisac to o tak ^(.+).php5$ - bo to wymusi ze plik sklada sie z przynajmniej jednego lub wiecej znakow + .php5 ?

Jasne, tak jest teoretycznie poprawniej, ja po prostu skopiowalem to z Twojego pierwszego posta. Aczkolwiek w tym przypadku jesli ktos poda jako requesta samo rozszerzenie to i tak takiego pliku nie bedzie, wiec czy to apache + php4 czy apache + php5 zwroci komunikat bledu to juz nie robi wielkiej roznicy.

Cytat
- teraz w RewriteRule - dlaczego zaczyna sie pierwszy czlon od znaku / i do czego sluzy pierwszy czlon - co w nim sprawdzasz

Caly string ktory dopasowujemy w RewriteRule pochodzi bezposrednio z naglowka, czyli jak mamy request typu:
Cytat
GET /jakis/katalog/skrypt.php?zm=cos&zm2=cos2 HTTP/1.0

to do RewriteRule idzie cala ta sciezka, lacznie z wszelkimi parametrami (pogrubione)
Caly ten czlon chcemy przekazac dalej, bo w nim nic nie zmieniamy, a slash jest tylko dla wygody.. moglem to zapisac rownie dobrze tak:
RewriteRule (.*) http://%{HTTP_HOST}:88$1 [P]
ale jak widzisz nic nie oddziela portu od $1, wiec postanowilem wykluczyc slasha z dopasowywania i zamiescic go recznie jako separator portu od $1.

Cytat
jak spelni sie warunek z RewriteCond to on stworzy ciag http://zmienna_srod_przechowujaca_wywolywa...a_z_RewriteCond i parametr [P] - aby przekazal to do mod_proxy?

Znowu blisko smile.gif Ale to juz opisalem wczesniej.. wiec zmienna jest przekazywana nie z RewriteCond, a z pierwszego parametru RewriteRule, gdzie mamy (.*) (wlasnie to - tzn. to co zostaje do tego dopasowane, czyli wszystko - jest tam wstawiane)

sie napisalem... mam nadzieje ze troche pomoglo smile.gif
anas
Hej.

@FiDO - Bardzo pomoglo. Mam przynajmniej jasnosc jak to dziala. Wielkie dzieki. A przy okazji - czy RewriteCond jest jakby instrukcja warunkowa ktora w przypadku dopasowania pozwoli na wykonanie polecenia RewriteRule, a jesli nie zostanie dopasowane cos w jego skladni to RewriteRule sie nie wykona? Bo w takim przypadku juz bede mial pelna jasnoc smile.gif.

pozdrowka i jeszcze raz za tak wyczerpujaca odpowiedz.

anas
FiDO
Cytat("Manual Apache")
The RewriteCond directive defines a rule condition. Precede a RewriteRule directive with one or more RewriteCond directives. The following rewriting rule is only used if its pattern matches the current state of the URI and if these additional conditions apply too

Czyli aby dany RewriteRule sie wykonal musza byc spelnione wszystkie warunki (RewriteCond) znajdujace sie przed nim (mozna wiec ulozyc kilka roznych regul z roznymi warunkami - szczegoly w manualu tongue.gif)

----edit:

Patch:
Kod
RewriteCond %{REQUEST_FILENAME} ^(.+)\.php5(/.*)?$ [NC]

Akurat mialem linka [...]list.php/php5 i sie na tym wykladalo.
Dodatkowo nie dzialaly "niceurls" w postaci np. skrypt.php5/action/sth
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.