Zend Framework na hostingu współdzielonym
Większość ofert hostingowych w Polsce od zawsze udostępnia nam jeden katalog, ew. możliwość wskazania dla danej domeny katalogu gdzie przechowujemy nasz projekt.
Dzięki temu wystarczy do niego wgrać aplikację i wszystko działa.
Kiedyś nie stanowiło to problemu, gdy cała aplikacja była w jednym worku, a za pomocą odpowiednich sztuczek nie pozwalało się na bezpośredni dostęp do plików źródłowych PHP lub konfiguracyjnych.
Obecnie, np. z punktu widzenia osoby tworzącej z wykorzystaniem Zend Framework stanowi to problem, ponieważ domyślny układ projektu wygląda tak:
application/
controllers/
views/
scripts/
library/
public/
tests/
Ze względów m.in. bezpieczeństwa w ZF jest wydzielony jeden katalog publiczny (public), który jest domyślnym katalogiem dostępnym z Sieci. Gdy taką aplikację umieścimy np. na hostingu w home.pl aplikacja nam się nie uruchomi, a każda osoba z Internetu będzie miała dostęp do wszystkich plików (pliki PHP nie stanowią problemu, ale już pliki INI, SQL tak). Wiele osób przegrywa plik index.php do katalogu nadrzędnego odpowiednio go modyfikując – to błąd. Owszem, aplikacja zadziała, ale nie poprawi to względów bezpieczeństwa.
Problem można bardzo łatwo rozwiązać jeśli nasz usługodawca daje możliwość umieszczania plików .htaccess:
RewriteEngine On
RewriteRule ^\.htaccess$ - [F]
RewriteCond %{REQUEST_URI} =""
RewriteRule ^.*$ /public/index.php [NC,L]
RewriteCond %{REQUEST_URI} !^/public/.*$
RewriteRule ^(.*)$ /public/$1
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^.*$ - [NC,L]
RewriteRule ^public/.*$ /public/index.php [NC,L]
Wystarczy go umieścić w katalogu głównym, a on załatwi już odpowiednie przekierowania poszczególnych wywołań.
Oczywiście jeśli mamy możliwość konfiguracji vhost-ów lub ustawienia katalogu aplikacji w inny sposób powinniśmy z niego skorzystać, zamiast cudować z htaccess.









pfugiel
27 sty, 2010
Myślę że lepiej po prostu poszukać hostingu w którym mamy więcej niż tylko jeden katalog publiczny. Niestety jest tak że zdecydowana większość wybiera nazwa.pl lub home.pl
Help me!
12 cze, 2010
Świeża aplikacja stworzona Zend Tool’em,
wklejam powyższe reguły do Test/.htaccess .
Pozostała struktura katalogów:
Test/application
Test/public
itd. ,wszystko standardowo.. a w logu apache’a dostaję:
[Sat Jun 12 14:34:40 2010] [error] [client 127.0.0.1] File does not exist: C:/Users/Domowy/Desktop/Serwer/public
[Sat Jun 12 14:34:40 2010] [error] [client 127.0.0.1] File does not exist: C:/Users/Domowy/Desktop/Serwer/favicon.ico
Proszę o pomoc…:)
Help me!
12 cze, 2010
A i dostaję w przeglądarce błąd:
„Nie można wyświetlić strony” … :/
/ „Oj! Ten link wygląda na uszkodzony.” (Chrome)
czyli 404 ;P
matipl
12 cze, 2010
@Help me!: Wygląda, że jakiś problem z konfiguracją Apache..Jak skonfigurowałeś/aś vhost-a ? Zapraszam ew. na bezpośredni kontakt
BlueMan
19 cze, 2010
No i .htaccess zabiera więcej CPU, niż skorzystanie z vhost.
matipl
19 cze, 2010
@BlueMan: oczywiście, że najlepiej zrobić rewrite w ramach konfiguracji vhosta, i później dać ciut odsapnąć. Zresztą niektóre serwery WWW tylko w ten sposób pozwalają skorzystać z rewrite…
Ale niestety nie zawsze mamy taką możliwość.
carlos
12 lip, 2010
Witaj,
wkleiłem sobie na home.pl twój config… problem jest taki ze w plikach z widokami nie chce odwolywac sie przez katalog public, tylko bezposrednio przez „/styles/style.css”. Oczywiscie katalog styles znajduje sie w katalogu public. Niestety strona nie laduje mi w ogole obrazkow… Oczywiscie pewnie dzieje sie tak dlatego ze ten plik po prostu nie istnieje – nalezaloby dokleic do %{REQUEST_FILENAME} w jakis sposob katalog public… ale jak? i jak to przekierowac? POMOCY
matipl
13 lip, 2010
@carlos: Problem o którym mówisz powinno załatwić (jak w przykładzie):
RewriteCond %{REQUEST_URI} !^/public/.*$
RewriteRule ^(.*)$ /public/$1
Czyli wszystko co nie zaczyna się od /public to dodaj do URL public
faramka
11 lip, 2011
Dzięki za wpis!
zwolu
18 lis, 2011
Co zrobić w przypadku kiedy rotuer jest zdefiniowany tak że nazwa ścieżki jest tożsama z nazwą katalogu w public? Np chce wejść na .com/test/par1/par2 i w katalogu public mam podkatalog test. Chciałbym żeby router rozwiązał tą ścieżkę nim wejdzie do katalogu fizycznego
matipl
22 lis, 2011
@zwolu: odpowiednią regułką htaccess
Możesz po prostu usunąć:
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^.*$ – [NC,L]
wtedy wszystko będzie lecieć do index.php
zwolu
22 lis, 2011
Dziękuję za odpowiedź