Witam. Mam konkretne pytanie. Męczę się już z tym od dłuższego czasu.
Pracuje na frameworku Symfony i rozwiązanie tego problemu byłoby dla mnie zbawieniem.
Mianowicie:

- mamy domenę domena.pl
- oraz cms.domena.pl
- potrzebuję aby domena.pl oraz cms.domena.pl kierowane były na katalog domena.pl/public_html/project/web/ . W katalogu web mam już swojego htaccess który w zależności od domeny kieruje do konkretnego kontrolera (czyt. pliku)

Próbowałem już różnymi sposobami. Problem się rozwiązuje gdy na katalog web/ ustawiane są virtual hosty domena.pl oraz cms.domena.pl.

Tego typu rozwiązanie niestety nie zdaje egzaminu:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^domena.pl(.*)$
RewriteRule (.*) http://www.domena.pl/$1 [R=301,L]
RewriteRule ^$ project/web/ [L]

Framework gubi mi linki wewnętrzne. Np. link http://www.domena.pl/images/frontend/under_construction.png jest traktowany jako link bezpośredni, a nie http://www.domena.pl/project/web/images/frontend/under_construction.png

Upraszczając chciałbym, aby jakiś guru linuxowy od htaccessa napisał jak za jego pomocą zrobić dokładnie to samo co przy pomocy virtual hosta, tzn. umieszczam htaccess w katalogu public_html/ a on kieruje ładnie do public_html/project/web/

i każdy link np. domena.pl/css/main.css jest traktowany jako domena.pl/project/web/kontroler/css/main.css

Proszę o pomoc.

dobra odkryłem. Należy to zrobić tak:
- .htaccess umieszczemy w katalogu public:

  1. Options +FollowSymLinks +ExecCGI
  2.  
  3. <IfModule mod_rewrite.c>
  4. RewriteEngine on
  5. RewriteRule ^(.*)$ /project/web/$1
  6. </IfModule>



- drugi htaccess umieszczamy w katalogu web. Ten kieruje na odpowiedni kontroler:
np.

  1. Options +FollowSymLinks +ExecCGI
  2.  
  3. <IfModule mod_rewrite.c>
  4. RewriteEngine On
  5.  
  6. # uncomment the following line, if you are having trouble
  7. # getting no_script_name to work
  8. #RewriteBase /
  9.  
  10. # we skip all files with .something
  11. #RewriteCond %{REQUEST_URI} \..+$
  12. #RewriteCond %{REQUEST_URI} !\.html$
  13. #RewriteRule .* - [L]
  14.  
  15. # www redirect
  16. RewriteCond %{HTTP_HOST} ^domena.pl(.*) [NC]
  17. RewriteRule ^(.*)$ http://www.domena.pl/$1 [R=301,L]
  18.  
  19. RewriteCond %{HTTP_HOST} ^cms.domena(.*) [NC]
  20. RewriteRule ^(.*)$ http://www.cms.domena.pl/$1 [R=301,L]
  21.  
  22. # we check if the .html version is here (caching)
  23. RewriteRule ^$ index.html [QSA]
  24. RewriteRule ^([^.]+)$ $1.html [QSA]
  25. RewriteCond %{REQUEST_FILENAME} !-f
  26.  
  27. # redirect to back controller
  28. RewriteCond %{HTTP_HOST} ^www.cms.domena.pl(.*) [NC]
  29. RewriteRule ^(.*)$ backend.php [QSA,L]
  30.  
  31. # redirect to front controller
  32. RewriteCond %{REQUEST_FILENAME} !-f
  33. RewriteRule ^(.*)$ index.php [QSA,L]
  34.  
  35.  
  36. </IfModule>


- kolejna rzeczą jest plik sfWebRequest. Trzeba go zmodyfikować w taki sposób, aby wycinał ze ścieżki katalogi, których nie chcemy w adresie. Znajduje się on w lib/request/:

  1. if (isset($this->pathInfoArray['SCRIPT_NAME']) &&
  2. preg_match('#^/project/web/#', $this->pathInfoArray['SCRIPT_NAME']))
  3. {
  4. $this->pathInfoArray['SCRIPT_NAME'] =
  5. preg_replace('#^/project/web/#', '/', $this->pathInfoArray['SCRIPT_NAME']);
  6. }



jeżeli chodzi o poddomeny... aby kierowane były na konkretną domenę, w tym przypadku domenę główną to najlepiej użyć wildcarda, na serwerze. Większość hostingów pozwala to zrobić z poziomu graficznego interfejsu.

powyższe punkty pozwalają w pełni skonfigurować minimum potrzebnych elementów do umieszczenia projektu na publicznym serwerze