Instalacja symfony w home.pl
Home.pl umożliwia podpięcie domeny pod konkretny wybrany przez nas katalog. Ma to swoje zalety, ale też i wady. Do zalet niewątpliwie należy zaliczyć fakt, że tak przygotowana domena z miejscem na serwerze zwiększa bezpieczeństwo i ułatwia zarządzanie serwisem, a całość działa jak osobny wirtualny serwer. Wadą takiego rozwiązania jest to, że powyżej katalogu do którego przypisana jest domena, nic nie jest dostępne. Powoduje to pewne problemy przy instalacji projektu stworzonego przy pomocą symfony, gdzie katalogiem startowym domyślnie jest katalog „/web”. Można oczywiście przebudować strukturę i całość zawartości z katalogu „/web” przenieść do katalogu głównego, psuje to jednak model zaproponowany przez twórców symfony. Istnieje także alternatywne rozwiązanie, które nie wymaga dużo pracy i pozwala pozostawić układ katalogów bez zmian. Rozwiązanie* to przedstawiam poniżej:
1. Plik .htaccess
W głównym katalogu tworzymy plik .htaccess o następującej treści:
Options +FollowSymLinks +ExecCGI <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)$ /web/$1 </IfModule>
Reguła ta odpowiada za przekierowanie do katalogu „/web” każdego requesta wysłanego do głównego katalogu. To już w zasadzie powinno wystarczyć do odpalenia projektu (o ile w pliku config/config.php zostały ustawione prawidłowe ścieżki dostępu do bibliotek symfony). Pozostaje do rozwiązania jeszcze jeden problem ponieważ do każdego linku wygenerowanego przez symfony będziemy mieć dodawane „/web” którego nie chcemy.
2. Plik sfWebRequest.class.php
Z biblioteki symfony odszukujemy plik lib/request/sfWebRequest.class.php. W metodzie getPathInfoArray(), po wyjściu z instrukcji switch dodajemy następujący kawałek:
if (isset($this->pathInfoArray['SCRIPT_NAME']) &&
preg_match('#^/web/#', $this->pathInfoArray['SCRIPT_NAME']))
{
$this->pathInfoArray['SCRIPT_NAME'] =
preg_replace('#^/web/#', '/', $this->pathInfoArray['SCRIPT_NAME']);
}
Kod ten sprawdza czy na początku ścieżki do pliku znajduje się kawałek „/web” i jeśli występuje to usuwa go.
3. Katalog tmp
W katalogu głównym tworzymy katalog tmp i nadajemy mu odpowiednie uprawnienia do zapisu i odczytu. W tym katalogu domyślnie będą zapisywane sesji użytkowników. Po tym zabiegu oraz po wyczyszczeniu cache wszystko już powinno działać prawidłowo.
4. Bonus
Lubię mieć porządek na serwerze, a że wersja _dev projektu krzyczy, że magic quotes na serwerze home.pl są domyślnie włączone to trzeba to naprawić. Można to zrobić oczywiście ze skryptu, poprzez ini_set(), ja jednak wole inne rozwiązanie. W tym celu w głównym katalogu tworzymy plik php.ini o następującej treści, która likwiduje nam problem:
[PHP] magic_quotes_gpc = Off
* Opis dla symfony w wesji 1.0.x. Dla nowszych wersji jeszcze nie sprawdzałem, ale podejrzewam, że będzie podobnie.
[Update:] Przedstawiony przeze mnie sposób działa dla symfony w wersjach od 1.0 do 1.4 (sprawdzone).
wielkie dzięki!
(skorzystałem z tego jakiś czas temu, ale chyba nie działały tu komentarze :>)
@drifter Prawda… Nie działały… Ale teraz już działają i miło wiedzieć że przydaje się to komuś więcej niż tylko SPAM-botom
Nie tylko spam-botom
Dzięki i pozdrawiam
Właśnie dzięki Twojemu postowi oszczędziłem sobie sporo nerwów
Wielkie dzięki!
Nie tylko spam-botom
bardzo sie przydaje… bardzo dziekuje za pomocny artykul! ;]
Jesteś boski.
Tego właśnie szukałem
Pozdrawiam
Właśnie się broniłem rękami i nogami przed stawianiem czegokolwiek z symfony na jakiś home.pl czy innym hostingu. Pewnie bym se z tym nie poradził, bo ostatnio musiałem w pół godziny postawić projekt na nieznanym mi w ogóle wcześniej serwerze. Na szczęście skończyło się na dedyku
działa tez dla symfony 1.2.7, tam szukamy public function getPathInfoArray() i jak dalej, po wyjściu ze switch {} dokładamy te linijki. I mryga.
a do spambotów polecam akismeta tak btw. Działa, po prostu działa.
Wiem, używam
Ale i tak komentarze zatwierdzam ręcznie… W końcu nie ma ich tak dużo
dziala, ale nadal jest dostep do plików konfiguracyjnych i biblioteki, jak sobie z tym poradzic?
Super dzięki za tego .htaccess`a
Przez łzy rozpaczy znalazłem ten post. Działa jak ta lala. Dziękuję bardzo.
Ten htaccess nie działa.
Daje error 500, bo zapętla.
Inna wersja .htaccess dla home.pl, gdyby komuś nie zatrybiło to co opisał autor posta.
RewriteEngine On
RewriteRule ^(.*)$ /web/$1 [R=301,L]
@baldram
Dzięki, właśnie pomysł autora nei bardzo u mnie trybił, bo mam stronę w podfolderze. Przekierowanie zadziałało. Ewentualnie może ktoś poradzi jakiego rewriterule potrzebuję w sytuacji, gdy projekt symfony leży w /jakis_folder, a dostać się tam można przez http://www.domena.pl/jakis_folder. Chciałem przekierować /jakis_folder na /jakis_folder/web i bez R301 nie idzie.
Podobnie zmiany w sfWebRequest.class.php też nie bardzo chcą działać. Nadal widzę linki z /web/ w środku.
Spróbuj sfWebRequest przerobić w ten sposób, żeby uwzględnić nie tylko katalog web, ale też twój katalog przez który chcesz się dostawać do projektu – powinno pomóc.
Witam….również mam stronę w podkatalogu i mam pytanie otóż na sandboxie formułka
if (isset($this->pathInfoArray['SCRIPT_NAME']) &&
preg_match(‘#^/strona.pl/web/#’, $this->pathInfoArray['SCRIPT_NAME']))
{
$this->pathInfoArray['SCRIPT_NAME'] =
preg_replace(‘#^/strona.pl/web/#’, ‘/’, $this->pathInfoArray['SCRIPT_NAME']);
}
jak najbardziej się sprawdzała. Niestety aktualnie projekt został przeniesiony na serwer i pojawił się problem. Dałem zmodyfikowany plik sfWebRequest.class.php do katalogu/lib/vendor/symfony/lib/request ale mam wrażenie jakby go nie widział. Powinienem zrobić coś jeszcze ?
Moje rozwiązanie ma sens w przypadku kiedy nie możemy skierować domeny w ten sposób, aby wskazywała na katalog /web. W home.pl podpięcie domeny kod katalog /web skutkuje tym, że projekt się nie odpali, bo z poziomu domeny nie będzie widoczne nic co jest nadrzędne względem katalog /web, natomiast gdy podepniemy domenę pod katalog sf_root_dir to projekt będzie działał, ale przy wchodzeniu przez domenę nie odpali się nam index.php z katalogu /web tylko wylistuje się zawartość katalogu sf_root_dir. Problem ten rozwiązuje .htaccess umieszczony w katalogu sf_root_dir który po wejściu przez domenę automatycznie, w niewidoczny sposób przenosi request do katalogu /web (a tam siedzi inny .htaccess który już dalej wie co z tym zrobić). Po tym zabiegu wszystkie URLe generowane przez projekt będą miały w adresie katalog „/web”. Reguła w pliku sfWebRequest.class.php ma za zadanie wykryć i usunąć z generowanych URLi ten katalog. W przypadku kiedy chcemy aby projekt działał pod adresem domena.com/jakis_katalog/ to przedstawione rozwiązanie raczej nie zadziała (choć tak na prawdę nigdy go nie testowałem), ale drobne poprawki właśnie w plikach .htaccess w katalogu sf_root_dir i w pliku sfWebRequest.class.php powinny załatwić sprawę (chodzi o to, żeby poprawnie przekierować request z katalogu sf_root_dir do podkatalogu /web oraz pozbyć się z generowanych URLi właśnie tego katalogu /web.