Home > PHP, symfony > Instalacja symfony w home.pl

Instalacja symfony w home.pl

Grudzień 3rd, 2008 Zostaw komentarz Idź do komentarzy

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).

Kategorie:PHP, symfony Tagi:, , ,
  1. Marzec 30th, 2009 at 21:07 | #1

    wielkie dzięki! :) (skorzystałem z tego jakiś czas temu, ale chyba nie działały tu komentarze :>)

  2. Marzec 31st, 2009 at 08:22 | #2

    @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

  3. Angelus
    Kwiecień 25th, 2009 at 09:37 | #3

    Nie tylko spam-botom ;) Dzięki i pozdrawiam

  4. Maj 8th, 2009 at 07:33 | #4

    Właśnie dzięki Twojemu postowi oszczędziłem sobie sporo nerwów :)
    Wielkie dzięki!

  5. Maj 29th, 2009 at 10:41 | #5

    Nie tylko spam-botom :D bardzo sie przydaje… bardzo dziekuje za pomocny artykul! ;]

  6. Czerwiec 13th, 2009 at 11:01 | #6

    Jesteś boski.
    Tego właśnie szukałem ;)

    Pozdrawiam

  7. Czerwiec 29th, 2009 at 22:07 | #7

    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 :)

  8. Październik 24th, 2009 at 15:02 | #8

    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.

  9. Październik 24th, 2009 at 15:03 | #9

    a do spambotów polecam akismeta tak btw. Działa, po prostu działa.

  10. Listopad 26th, 2009 at 08:48 | #10

    Wiem, używam :)
    Ale i tak komentarze zatwierdzam ręcznie… W końcu nie ma ich tak dużo ;)

  11. puffer
    Marzec 17th, 2010 at 23:27 | #11

    dziala, ale nadal jest dostep do plików konfiguracyjnych i biblioteki, jak sobie z tym poradzic?

  12. Czerwiec 4th, 2010 at 21:47 | #12

    Super dzięki za tego .htaccess`a

  13. Marcin
    Czerwiec 29th, 2010 at 14:06 | #13

    Przez łzy rozpaczy znalazłem ten post. Działa jak ta lala. Dziękuję bardzo.

  14. Grudzień 29th, 2010 at 17:18 | #14

    Ten htaccess nie działa.
    Daje error 500, bo zapętla.

  15. baldram
    Styczeń 13th, 2011 at 22:02 | #15

    Inna wersja .htaccess dla home.pl, gdyby komuś nie zatrybiło to co opisał autor posta.

    RewriteEngine On
    RewriteRule ^(.*)$ /web/$1 [R=301,L]

  16. p1
    Luty 7th, 2011 at 19:36 | #16

    @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.

  17. Luty 8th, 2011 at 08:10 | #17

    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.

  18. Janek
    Marzec 9th, 2011 at 01:00 | #18

    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 ?

  19. Marzec 9th, 2011 at 08:28 | #19

    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.

  20. Pjotr
    Luty 7th, 2013 at 21:35 | #20

    Męczyłem się chyba z tydzień z ustawieniem tego wszystkiego na jednym z darmowych serwerów. I tutaj znalazłem jedyne działające rozwiązanie. Kolego, w weekend napiję się piwa za Twoje zdrowie! :)

  21. Luty 7th, 2013 at 21:46 | #21

    hehe… Ja już zapomniałem, że kiedyś popełniłem taki post, ale bardzo miło czytać, że komuś się jeszcze to do czegoś przydało. Twoje zdrowie.

  1. Brak jeszcze trackbacków